mirror of
https://github.com/nodejs/node.git
synced 2025-04-30 07:19:19 +00:00

PR-URL: https://github.com/nodejs/node/pull/56991 Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
709 lines
28 KiB
Markdown
709 lines
28 KiB
Markdown
# SQLite
|
|
|
|
<!--introduced_in=v22.5.0-->
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
> Stability: 1.1 - Active development.
|
|
|
|
<!-- source_link=lib/sqlite.js -->
|
|
|
|
The `node:sqlite` module facilitates working with SQLite databases.
|
|
To access it:
|
|
|
|
```mjs
|
|
import sqlite from 'node:sqlite';
|
|
```
|
|
|
|
```cjs
|
|
const sqlite = require('node:sqlite');
|
|
```
|
|
|
|
This module is only available under the `node:` scheme.
|
|
|
|
The following example shows the basic usage of the `node:sqlite` module to open
|
|
an in-memory database, write data to the database, and then read the data back.
|
|
|
|
```mjs
|
|
import { DatabaseSync } from 'node:sqlite';
|
|
const database = new DatabaseSync(':memory:');
|
|
|
|
// Execute SQL statements from strings.
|
|
database.exec(`
|
|
CREATE TABLE data(
|
|
key INTEGER PRIMARY KEY,
|
|
value TEXT
|
|
) STRICT
|
|
`);
|
|
// Create a prepared statement to insert data into the database.
|
|
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
|
|
// Execute the prepared statement with bound values.
|
|
insert.run(1, 'hello');
|
|
insert.run(2, 'world');
|
|
// Create a prepared statement to read data from the database.
|
|
const query = database.prepare('SELECT * FROM data ORDER BY key');
|
|
// Execute the prepared statement and log the result set.
|
|
console.log(query.all());
|
|
// Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]
|
|
```
|
|
|
|
```cjs
|
|
'use strict';
|
|
const { DatabaseSync } = require('node:sqlite');
|
|
const database = new DatabaseSync(':memory:');
|
|
|
|
// Execute SQL statements from strings.
|
|
database.exec(`
|
|
CREATE TABLE data(
|
|
key INTEGER PRIMARY KEY,
|
|
value TEXT
|
|
) STRICT
|
|
`);
|
|
// Create a prepared statement to insert data into the database.
|
|
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
|
|
// Execute the prepared statement with bound values.
|
|
insert.run(1, 'hello');
|
|
insert.run(2, 'world');
|
|
// Create a prepared statement to read data from the database.
|
|
const query = database.prepare('SELECT * FROM data ORDER BY key');
|
|
// Execute the prepared statement and log the result set.
|
|
console.log(query.all());
|
|
// Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]
|
|
```
|
|
|
|
## Class: `DatabaseSync`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
changes:
|
|
- version: REPLACEME
|
|
pr-url: https://github.com/nodejs/node/pull/56991
|
|
description: The `path` argument now supports Buffer and URL objects.
|
|
-->
|
|
|
|
This class represents a single [connection][] to a SQLite database. All APIs
|
|
exposed by this class execute synchronously.
|
|
|
|
### `new DatabaseSync(path[, options])`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* `path` {string | Buffer | URL} The path of the database. A SQLite database can be
|
|
stored in a file or completely [in memory][]. To use a file-backed database,
|
|
the path should be a file path. To use an in-memory database, the path
|
|
should be the special name `':memory:'`.
|
|
* `options` {Object} Configuration options for the database connection. The
|
|
following options are supported:
|
|
* `open` {boolean} If `true`, the database is opened by the constructor. When
|
|
this value is `false`, the database must be opened via the `open()` method.
|
|
**Default:** `true`.
|
|
* `readOnly` {boolean} If `true`, the database is opened in read-only mode.
|
|
If the database does not exist, opening it will fail. **Default:** `false`.
|
|
* `enableForeignKeyConstraints` {boolean} If `true`, foreign key constraints
|
|
are enabled. This is recommended but can be disabled for compatibility with
|
|
legacy database schemas. The enforcement of foreign key constraints can be
|
|
enabled and disabled after opening the database using
|
|
[`PRAGMA foreign_keys`][]. **Default:** `true`.
|
|
* `enableDoubleQuotedStringLiterals` {boolean} If `true`, SQLite will accept
|
|
[double-quoted string literals][]. This is not recommended but can be
|
|
enabled for compatibility with legacy database schemas.
|
|
**Default:** `false`.
|
|
* `allowExtension` {boolean} If `true`, the `loadExtension` SQL function
|
|
and the `loadExtension()` method are enabled.
|
|
You can call `enableLoadExtension(false)` later to disable this feature.
|
|
**Default:** `false`.
|
|
|
|
Constructs a new `DatabaseSync` instance.
|
|
|
|
### `database.close()`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
Closes the database connection. An exception is thrown if the database is not
|
|
open. This method is a wrapper around [`sqlite3_close_v2()`][].
|
|
|
|
### `database.loadExtension(path)`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.5.0
|
|
- v22.13.0
|
|
-->
|
|
|
|
* `path` {string} The path to the shared library to load.
|
|
|
|
Loads a shared library into the database connection. This method is a wrapper
|
|
around [`sqlite3_load_extension()`][]. It is required to enable the
|
|
`allowExtension` option when constructing the `DatabaseSync` instance.
|
|
|
|
### `database.enableLoadExtension(allow)`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.5.0
|
|
- v22.13.0
|
|
-->
|
|
|
|
* `allow` {boolean} Whether to allow loading extensions.
|
|
|
|
Enables or disables the `loadExtension` SQL function, and the `loadExtension()`
|
|
method. When `allowExtension` is `false` when constructing, you cannot enable
|
|
loading extensions for security reasons.
|
|
|
|
### `database.exec(sql)`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* `sql` {string} A SQL string to execute.
|
|
|
|
This method allows one or more SQL statements to be executed without returning
|
|
any results. This method is useful when executing SQL statements read from a
|
|
file. This method is a wrapper around [`sqlite3_exec()`][].
|
|
|
|
### `database.function(name[, options], function)`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.5.0
|
|
- v22.13.0
|
|
-->
|
|
|
|
* `name` {string} The name of the SQLite function to create.
|
|
* `options` {Object} Optional configuration settings for the function. The
|
|
following properties are supported:
|
|
* `deterministic` {boolean} If `true`, the [`SQLITE_DETERMINISTIC`][] flag is
|
|
set on the created function. **Default:** `false`.
|
|
* `directOnly` {boolean} If `true`, the [`SQLITE_DIRECTONLY`][] flag is set on
|
|
the created function. **Default:** `false`.
|
|
* `useBigIntArguments` {boolean} If `true`, integer arguments to `function`
|
|
are converted to `BigInt`s. If `false`, integer arguments are passed as
|
|
JavaScript numbers. **Default:** `false`.
|
|
* `varargs` {boolean} If `true`, `function` may be invoked with any number of
|
|
arguments (between zero and [`SQLITE_MAX_FUNCTION_ARG`][]). If `false`,
|
|
`function` must be invoked with exactly `function.length` arguments.
|
|
**Default:** `false`.
|
|
* `function` {Function} The JavaScript function to call when the SQLite
|
|
function is invoked. The return value of this function should be a valid
|
|
SQLite data type: see [Type conversion between JavaScript and SQLite][].
|
|
The result defaults to `NULL` if the return value is `undefined`.
|
|
|
|
This method is used to create SQLite user-defined functions. This method is a
|
|
wrapper around [`sqlite3_create_function_v2()`][].
|
|
|
|
### `database.open()`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
Opens the database specified in the `path` argument of the `DatabaseSync`
|
|
constructor. This method should only be used when the database is not opened via
|
|
the constructor. An exception is thrown if the database is already open.
|
|
|
|
### `database.prepare(sql)`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* `sql` {string} A SQL string to compile to a prepared statement.
|
|
* Returns: {StatementSync} The prepared statement.
|
|
|
|
Compiles a SQL statement into a [prepared statement][]. This method is a wrapper
|
|
around [`sqlite3_prepare_v2()`][].
|
|
|
|
### `database.createSession([options])`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.3.0
|
|
- v22.12.0
|
|
-->
|
|
|
|
* `options` {Object} The configuration options for the session.
|
|
* `table` {string} A specific table to track changes for. By default, changes to all tables are tracked.
|
|
* `db` {string} Name of the database to track. This is useful when multiple databases have been added using [`ATTACH DATABASE`][]. **Default**: `'main'`.
|
|
* Returns: {Session} A session handle.
|
|
|
|
Creates and attaches a session to the database. This method is a wrapper around [`sqlite3session_create()`][] and [`sqlite3session_attach()`][].
|
|
|
|
### `database.applyChangeset(changeset[, options])`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.3.0
|
|
- v22.12.0
|
|
-->
|
|
|
|
* `changeset` {Uint8Array} A binary changeset or patchset.
|
|
* `options` {Object} The configuration options for how the changes will be applied.
|
|
* `filter` {Function} Skip changes that, when targeted table name is supplied to this function, return a truthy value.
|
|
By default, all changes are attempted.
|
|
* `onConflict` {Function} A function that determines how to handle conflicts. The function receives one argument,
|
|
which can be one of the following values:
|
|
|
|
* `SQLITE_CHANGESET_DATA`: A `DELETE` or `UPDATE` change does not contain the expected "before" values.
|
|
* `SQLITE_CHANGESET_NOTFOUND`: A row matching the primary key of the `DELETE` or `UPDATE` change does not exist.
|
|
* `SQLITE_CHANGESET_CONFLICT`: An `INSERT` change results in a duplicate primary key.
|
|
* `SQLITE_CHANGESET_FOREIGN_KEY`: Applying a change would result in a foreign key violation.
|
|
* `SQLITE_CHANGESET_CONSTRAINT`: Applying a change results in a `UNIQUE`, `CHECK`, or `NOT NULL` constraint
|
|
violation.
|
|
|
|
The function should return one of the following values:
|
|
|
|
* `SQLITE_CHANGESET_OMIT`: Omit conflicting changes.
|
|
* `SQLITE_CHANGESET_REPLACE`: Replace existing values with conflicting changes (only valid with
|
|
`SQLITE_CHANGESET_DATA` or `SQLITE_CHANGESET_CONFLICT` conflicts).
|
|
* `SQLITE_CHANGESET_ABORT`: Abort on conflict and roll back the database.
|
|
|
|
When an error is thrown in the conflict handler or when any other value is returned from the handler,
|
|
applying the changeset is aborted and the database is rolled back.
|
|
|
|
**Default**: A function that returns `SQLITE_CHANGESET_ABORT`.
|
|
* Returns: {boolean} Whether the changeset was applied succesfully without being aborted.
|
|
|
|
An exception is thrown if the database is not
|
|
open. This method is a wrapper around [`sqlite3changeset_apply()`][].
|
|
|
|
```js
|
|
const sourceDb = new DatabaseSync(':memory:');
|
|
const targetDb = new DatabaseSync(':memory:');
|
|
|
|
sourceDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
|
|
targetDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
|
|
|
|
const session = sourceDb.createSession();
|
|
|
|
const insert = sourceDb.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
|
|
insert.run(1, 'hello');
|
|
insert.run(2, 'world');
|
|
|
|
const changeset = session.changeset();
|
|
targetDb.applyChangeset(changeset);
|
|
// Now that the changeset has been applied, targetDb contains the same data as sourceDb.
|
|
```
|
|
|
|
## Class: `Session`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.3.0
|
|
- v22.12.0
|
|
-->
|
|
|
|
### `session.changeset()`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.3.0
|
|
- v22.12.0
|
|
-->
|
|
|
|
* Returns: {Uint8Array} Binary changeset that can be applied to other databases.
|
|
|
|
Retrieves a changeset containing all changes since the changeset was created. Can be called multiple times.
|
|
An exception is thrown if the database or the session is not open. This method is a wrapper around [`sqlite3session_changeset()`][].
|
|
|
|
### `session.patchset()`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.3.0
|
|
- v22.12.0
|
|
-->
|
|
|
|
* Returns: {Uint8Array} Binary patchset that can be applied to other databases.
|
|
|
|
Similar to the method above, but generates a more compact patchset. See [Changesets and Patchsets][]
|
|
in the documentation of SQLite. An exception is thrown if the database or the session is not open. This method is a
|
|
wrapper around [`sqlite3session_patchset()`][].
|
|
|
|
### `session.close()`.
|
|
|
|
Closes the session. An exception is thrown if the database or the session is not open. This method is a
|
|
wrapper around [`sqlite3session_delete()`][].
|
|
|
|
## Class: `StatementSync`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
This class represents a single [prepared statement][]. This class cannot be
|
|
instantiated via its constructor. Instead, instances are created via the
|
|
`database.prepare()` method. All APIs exposed by this class execute
|
|
synchronously.
|
|
|
|
A prepared statement is an efficient binary representation of the SQL used to
|
|
create it. Prepared statements are parameterizable, and can be invoked multiple
|
|
times with different bound values. Parameters also offer protection against
|
|
[SQL injection][] attacks. For these reasons, prepared statements are preferred
|
|
over hand-crafted SQL strings when handling user input.
|
|
|
|
### `statement.all([namedParameters][, ...anonymousParameters])`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
changes:
|
|
- version:
|
|
- v23.7.0
|
|
- v22.14.0
|
|
pr-url: https://github.com/nodejs/node/pull/56385
|
|
description: Add support for `DataView` and typed array objects for `anonymousParameters`.
|
|
-->
|
|
|
|
* `namedParameters` {Object} An optional object used to bind named parameters.
|
|
The keys of this object are used to configure the mapping.
|
|
* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or
|
|
more values to bind to anonymous parameters.
|
|
* Returns: {Array} An array of objects. Each object corresponds to a row
|
|
returned by executing the prepared statement. The keys and values of each
|
|
object correspond to the column names and values of the row.
|
|
|
|
This method executes a prepared statement and returns all results as an array of
|
|
objects. If the prepared statement does not return any results, this method
|
|
returns an empty array. The prepared statement [parameters are bound][] using
|
|
the values in `namedParameters` and `anonymousParameters`.
|
|
|
|
### `statement.expandedSQL`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* {string} The source SQL expanded to include parameter values.
|
|
|
|
The source SQL text of the prepared statement with parameter
|
|
placeholders replaced by the values that were used during the most recent
|
|
execution of this prepared statement. This property is a wrapper around
|
|
[`sqlite3_expanded_sql()`][].
|
|
|
|
### `statement.get([namedParameters][, ...anonymousParameters])`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
changes:
|
|
- version:
|
|
- v23.7.0
|
|
- v22.14.0
|
|
pr-url: https://github.com/nodejs/node/pull/56385
|
|
description: Add support for `DataView` and typed array objects for `anonymousParameters`.
|
|
-->
|
|
|
|
* `namedParameters` {Object} An optional object used to bind named parameters.
|
|
The keys of this object are used to configure the mapping.
|
|
* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or
|
|
more values to bind to anonymous parameters.
|
|
* Returns: {Object|undefined} An object corresponding to the first row returned
|
|
by executing the prepared statement. The keys and values of the object
|
|
correspond to the column names and values of the row. If no rows were returned
|
|
from the database then this method returns `undefined`.
|
|
|
|
This method executes a prepared statement and returns the first result as an
|
|
object. If the prepared statement does not return any results, this method
|
|
returns `undefined`. The prepared statement [parameters are bound][] using the
|
|
values in `namedParameters` and `anonymousParameters`.
|
|
|
|
### `statement.iterate([namedParameters][, ...anonymousParameters])`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.4.0
|
|
- v22.13.0
|
|
changes:
|
|
- version:
|
|
- v23.7.0
|
|
- v22.14.0
|
|
pr-url: https://github.com/nodejs/node/pull/56385
|
|
description: Add support for `DataView` and typed array objects for `anonymousParameters`.
|
|
-->
|
|
|
|
* `namedParameters` {Object} An optional object used to bind named parameters.
|
|
The keys of this object are used to configure the mapping.
|
|
* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or
|
|
more values to bind to anonymous parameters.
|
|
* Returns: {Iterator} An iterable iterator of objects. Each object corresponds to a row
|
|
returned by executing the prepared statement. The keys and values of each
|
|
object correspond to the column names and values of the row.
|
|
|
|
This method executes a prepared statement and returns an iterator of
|
|
objects. If the prepared statement does not return any results, this method
|
|
returns an empty iterator. The prepared statement [parameters are bound][] using
|
|
the values in `namedParameters` and `anonymousParameters`.
|
|
|
|
### `statement.run([namedParameters][, ...anonymousParameters])`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
changes:
|
|
- version:
|
|
- v23.7.0
|
|
- v22.14.0
|
|
pr-url: https://github.com/nodejs/node/pull/56385
|
|
description: Add support for `DataView` and typed array objects for `anonymousParameters`.
|
|
-->
|
|
|
|
* `namedParameters` {Object} An optional object used to bind named parameters.
|
|
The keys of this object are used to configure the mapping.
|
|
* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or
|
|
more values to bind to anonymous parameters.
|
|
* Returns: {Object}
|
|
* `changes`: {number|bigint} The number of rows modified, inserted, or deleted
|
|
by the most recently completed `INSERT`, `UPDATE`, or `DELETE` statement.
|
|
This field is either a number or a `BigInt` depending on the prepared
|
|
statement's configuration. This property is the result of
|
|
[`sqlite3_changes64()`][].
|
|
* `lastInsertRowid`: {number|bigint} The most recently inserted rowid. This
|
|
field is either a number or a `BigInt` depending on the prepared statement's
|
|
configuration. This property is the result of
|
|
[`sqlite3_last_insert_rowid()`][].
|
|
|
|
This method executes a prepared statement and returns an object summarizing the
|
|
resulting changes. The prepared statement [parameters are bound][] using the
|
|
values in `namedParameters` and `anonymousParameters`.
|
|
|
|
### `statement.setAllowBareNamedParameters(enabled)`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* `enabled` {boolean} Enables or disables support for binding named parameters
|
|
without the prefix character.
|
|
|
|
The names of SQLite parameters begin with a prefix character. By default,
|
|
`node:sqlite` requires that this prefix character is present when binding
|
|
parameters. However, with the exception of dollar sign character, these
|
|
prefix characters also require extra quoting when used in object keys.
|
|
|
|
To improve ergonomics, this method can be used to also allow bare named
|
|
parameters, which do not require the prefix character in JavaScript code. There
|
|
are several caveats to be aware of when enabling bare named parameters:
|
|
|
|
* The prefix character is still required in SQL.
|
|
* The prefix character is still allowed in JavaScript. In fact, prefixed names
|
|
will have slightly better binding performance.
|
|
* Using ambiguous named parameters, such as `$k` and `@k`, in the same prepared
|
|
statement will result in an exception as it cannot be determined how to bind
|
|
a bare name.
|
|
|
|
### `statement.setReadBigInts(enabled)`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* `enabled` {boolean} Enables or disables the use of `BigInt`s when reading
|
|
`INTEGER` fields from the database.
|
|
|
|
When reading from the database, SQLite `INTEGER`s are mapped to JavaScript
|
|
numbers by default. However, SQLite `INTEGER`s can store values larger than
|
|
JavaScript numbers are capable of representing. In such cases, this method can
|
|
be used to read `INTEGER` data using JavaScript `BigInt`s. This method has no
|
|
impact on database write operations where numbers and `BigInt`s are both
|
|
supported at all times.
|
|
|
|
### `statement.sourceSQL`
|
|
|
|
<!-- YAML
|
|
added: v22.5.0
|
|
-->
|
|
|
|
* {string} The source SQL used to create this prepared statement.
|
|
|
|
The source SQL text of the prepared statement. This property is a
|
|
wrapper around [`sqlite3_sql()`][].
|
|
|
|
### Type conversion between JavaScript and SQLite
|
|
|
|
When Node.js writes to or reads from SQLite it is necessary to convert between
|
|
JavaScript data types and SQLite's [data types][]. Because JavaScript supports
|
|
more data types than SQLite, only a subset of JavaScript types are supported.
|
|
Attempting to write an unsupported data type to SQLite will result in an
|
|
exception.
|
|
|
|
| SQLite | JavaScript |
|
|
| --------- | -------------------------- |
|
|
| `NULL` | {null} |
|
|
| `INTEGER` | {number} or {bigint} |
|
|
| `REAL` | {number} |
|
|
| `TEXT` | {string} |
|
|
| `BLOB` | {TypedArray} or {DataView} |
|
|
|
|
## `sqlite.backup(sourceDb, path[, options])`
|
|
|
|
<!-- YAML
|
|
added: v23.8.0
|
|
changes:
|
|
- version: REPLACEME
|
|
pr-url: https://github.com/nodejs/node/pull/56991
|
|
description: The `path` argument now supports Buffer and URL objects.
|
|
-->
|
|
|
|
* `sourceDb` {DatabaseSync} The database to backup. The source database must be open.
|
|
* `path` {string | Buffer | URL} The path where the backup will be created. If the file already exists,
|
|
the contents will be overwritten.
|
|
* `options` {Object} Optional configuration for the backup. The
|
|
following properties are supported:
|
|
* `source` {string} Name of the source database. This can be `'main'` (the default primary database) or any other
|
|
database that have been added with [`ATTACH DATABASE`][] **Default:** `'main'`.
|
|
* `target` {string} Name of the target database. This can be `'main'` (the default primary database) or any other
|
|
database that have been added with [`ATTACH DATABASE`][] **Default:** `'main'`.
|
|
* `rate` {number} Number of pages to be transmitted in each batch of the backup. **Default:** `100`.
|
|
* `progress` {Function} Callback function that will be called with the number of pages copied and the total number of
|
|
pages.
|
|
* Returns: {Promise} A promise that resolves when the backup is completed and rejects if an error occurs.
|
|
|
|
This method makes a database backup. This method abstracts the [`sqlite3_backup_init()`][], [`sqlite3_backup_step()`][]
|
|
and [`sqlite3_backup_finish()`][] functions.
|
|
|
|
The backed-up database can be used normally during the backup process. Mutations coming from the same connection - same
|
|
{DatabaseSync} - object will be reflected in the backup right away. However, mutations from other connections will cause
|
|
the backup process to restart.
|
|
|
|
```cjs
|
|
const { backup, DatabaseSync } = require('node:sqlite');
|
|
|
|
(async () => {
|
|
const sourceDb = new DatabaseSync('source.db');
|
|
const totalPagesTransferred = await backup(sourceDb, 'backup.db', {
|
|
rate: 1, // Copy one page at a time.
|
|
progress: ({ totalPages, remainingPages }) => {
|
|
console.log('Backup in progress', { totalPages, remainingPages });
|
|
},
|
|
});
|
|
|
|
console.log('Backup completed', totalPagesTransferred);
|
|
})();
|
|
```
|
|
|
|
```mjs
|
|
import { backup, DatabaseSync } from 'node:sqlite';
|
|
|
|
const sourceDb = new DatabaseSync('source.db');
|
|
const totalPagesTransferred = await backup(sourceDb, 'backup.db', {
|
|
rate: 1, // Copy one page at a time.
|
|
progress: ({ totalPages, remainingPages }) => {
|
|
console.log('Backup in progress', { totalPages, remainingPages });
|
|
},
|
|
});
|
|
|
|
console.log('Backup completed', totalPagesTransferred);
|
|
```
|
|
|
|
## `sqlite.constants`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v23.5.0
|
|
- v22.13.0
|
|
-->
|
|
|
|
* {Object}
|
|
|
|
An object containing commonly used constants for SQLite operations.
|
|
|
|
### SQLite constants
|
|
|
|
The following constants are exported by the `sqlite.constants` object.
|
|
|
|
#### Conflict resolution constants
|
|
|
|
One of the following constants is available as an argument to the `onConflict`
|
|
conflict resolution handler passed to [`database.applyChangeset()`][]. See also
|
|
[Constants Passed To The Conflict Handler][] in the SQLite documentation.
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Constant</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_DATA</code></td>
|
|
<td>The conflict handler is invoked with this constant when processing a DELETE or UPDATE change if a row with the required PRIMARY KEY fields is present in the database, but one or more other (non primary-key) fields modified by the update do not contain the expected "before" values.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_NOTFOUND</code></td>
|
|
<td>The conflict handler is invoked with this constant when processing a DELETE or UPDATE change if a row with the required PRIMARY KEY fields is not present in the database.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_CONFLICT</code></td>
|
|
<td>This constant is passed to the conflict handler while processing an INSERT change if the operation would result in duplicate primary key values.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_CONSTRAINT</code></td>
|
|
<td>If foreign key handling is enabled, and applying a changeset leaves the database in a state containing foreign key violations, the conflict handler is invoked with this constant exactly once before the changeset is committed. If the conflict handler returns <code>SQLITE_CHANGESET_OMIT</code>, the changes, including those that caused the foreign key constraint violation, are committed. Or, if it returns <code>SQLITE_CHANGESET_ABORT</code>, the changeset is rolled back.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_FOREIGN_KEY</code></td>
|
|
<td>If any other constraint violation occurs while applying a change (i.e. a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is invoked with this constant.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
One of the following constants must be returned from the `onConflict` conflict
|
|
resolution handler passed to [`database.applyChangeset()`][]. See also
|
|
[Constants Returned From The Conflict Handler][] in the SQLite documentation.
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Constant</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_OMIT</code></td>
|
|
<td>Conflicting changes are omitted.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_REPLACE</code></td>
|
|
<td>Conflicting changes replace existing values. Note that this value can only be returned when the type of conflict is either <code>SQLITE_CHANGESET_DATA</code> or <code>SQLITE_CHANGESET_CONFLICT</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>SQLITE_CHANGESET_ABORT</code></td>
|
|
<td>Abort when a change encounters a conflict and roll back database.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
[Changesets and Patchsets]: https://www.sqlite.org/sessionintro.html#changesets_and_patchsets
|
|
[Constants Passed To The Conflict Handler]: https://www.sqlite.org/session/c_changeset_conflict.html
|
|
[Constants Returned From The Conflict Handler]: https://www.sqlite.org/session/c_changeset_abort.html
|
|
[SQL injection]: https://en.wikipedia.org/wiki/SQL_injection
|
|
[Type conversion between JavaScript and SQLite]: #type-conversion-between-javascript-and-sqlite
|
|
[`ATTACH DATABASE`]: https://www.sqlite.org/lang_attach.html
|
|
[`PRAGMA foreign_keys`]: https://www.sqlite.org/pragma.html#pragma_foreign_keys
|
|
[`SQLITE_DETERMINISTIC`]: https://www.sqlite.org/c3ref/c_deterministic.html
|
|
[`SQLITE_DIRECTONLY`]: https://www.sqlite.org/c3ref/c_deterministic.html
|
|
[`SQLITE_MAX_FUNCTION_ARG`]: https://www.sqlite.org/limits.html#max_function_arg
|
|
[`database.applyChangeset()`]: #databaseapplychangesetchangeset-options
|
|
[`sqlite3_backup_finish()`]: https://www.sqlite.org/c3ref/backup_finish.html#sqlite3backupfinish
|
|
[`sqlite3_backup_init()`]: https://www.sqlite.org/c3ref/backup_finish.html#sqlite3backupinit
|
|
[`sqlite3_backup_step()`]: https://www.sqlite.org/c3ref/backup_finish.html#sqlite3backupstep
|
|
[`sqlite3_changes64()`]: https://www.sqlite.org/c3ref/changes.html
|
|
[`sqlite3_close_v2()`]: https://www.sqlite.org/c3ref/close.html
|
|
[`sqlite3_create_function_v2()`]: https://www.sqlite.org/c3ref/create_function.html
|
|
[`sqlite3_exec()`]: https://www.sqlite.org/c3ref/exec.html
|
|
[`sqlite3_expanded_sql()`]: https://www.sqlite.org/c3ref/expanded_sql.html
|
|
[`sqlite3_last_insert_rowid()`]: https://www.sqlite.org/c3ref/last_insert_rowid.html
|
|
[`sqlite3_load_extension()`]: https://www.sqlite.org/c3ref/load_extension.html
|
|
[`sqlite3_prepare_v2()`]: https://www.sqlite.org/c3ref/prepare.html
|
|
[`sqlite3_sql()`]: https://www.sqlite.org/c3ref/expanded_sql.html
|
|
[`sqlite3changeset_apply()`]: https://www.sqlite.org/session/sqlite3changeset_apply.html
|
|
[`sqlite3session_attach()`]: https://www.sqlite.org/session/sqlite3session_attach.html
|
|
[`sqlite3session_changeset()`]: https://www.sqlite.org/session/sqlite3session_changeset.html
|
|
[`sqlite3session_create()`]: https://www.sqlite.org/session/sqlite3session_create.html
|
|
[`sqlite3session_delete()`]: https://www.sqlite.org/session/sqlite3session_delete.html
|
|
[`sqlite3session_patchset()`]: https://www.sqlite.org/session/sqlite3session_patchset.html
|
|
[connection]: https://www.sqlite.org/c3ref/sqlite3.html
|
|
[data types]: https://www.sqlite.org/datatype3.html
|
|
[double-quoted string literals]: https://www.sqlite.org/quirks.html#dblquote
|
|
[in memory]: https://www.sqlite.org/inmemorydb.html
|
|
[parameters are bound]: https://www.sqlite.org/c3ref/bind_blob.html
|
|
[prepared statement]: https://www.sqlite.org/c3ref/stmt.html
|