Optional
filename: stringThe filename of the database to open. Pass an empty string (""
) or ":memory:"
or undefined for an in-memory database.
Optional
options: number | { create?: boolean; readonly?: boolean; readwrite?: boolean }defaults to {readwrite: true, create: true}
. If a number, then it's treated as SQLITE_OPEN_*
constant flags.
Readonly
filenameThe filename passed when new Database()
was called
const db = new Database("mydb.sqlite");
console.log(db.filename);
// => "mydb.sqlite"
Readonly
handleThe underlying sqlite3
database handle
In native code, this is not a file descriptor, but an index into an array of database handles
Is the database in a transaction?
true
if the database is in a transaction, false
otherwise
db.run("CREATE TABLE foo (bar TEXT)");
db.run("INSERT INTO foo VALUES (?)", "baz");
db.run("BEGIN");
db.run("INSERT INTO foo VALUES (?)", "qux");
console.log(db.inTransaction());
Close the database connection.
It is safe to call this method multiple times. If the database is already closed, this is a no-op. Running queries after the database has been closed will throw an error.
db.close();
This is called automatically when the database instance is garbage collected.
Internally, this calls sqlite3_close_v2
.
This is an alias of Database.prototype.run
Rest
...bindings: ParamsType[]Load a SQLite3 extension
macOS requires a custom SQLite3 library to be linked because the Apple build of SQLite for macOS disables loading extensions. See setCustomSQLite
Bun chooses the Apple build of SQLite on macOS because it brings a ~50% performance improvement.
name/path of the extension to load
Optional
entryPoint: stringoptional entry point of the extension
Compile a SQL query and return a Statement object.
This does not cache the compiled query and does not execute the query.
// compile the query
const stmt = db.query("SELECT * FROM foo WHERE bar = ?");
// run the query
stmt.all("baz");
Statment
instance
Under the hood, this calls sqlite3_prepare_v3
.
The SQL query to compile
Rest
...params: ParamsType[]Optional bindings for the query
Compile a SQL query and return a Statement object. This is the same as prepare except that it caches the compiled query.
This does not execute the query, but instead prepares it for later execution and caches the compiled query if possible.
// compile the query
const stmt = db.query("SELECT * FROM foo WHERE bar = ?");
// run the query
stmt.all("baz");
// run the query again
stmt.all();
Statment
instance
Under the hood, this calls sqlite3_prepare_v3
.
Execute a SQL query without returning any results.
This does not cache the query, so if you want to run a query multiple times, you should use prepare instead.
db.run("CREATE TABLE foo (bar TEXT)");
db.run("INSERT INTO foo VALUES (?)", "baz");
Useful for queries like:
CREATE TABLE
INSERT INTO
UPDATE
DELETE FROM
DROP TABLE
PRAGMA
ATTACH DATABASE
DETACH DATABASE
REINDEX
VACUUM
EXPLAIN ANALYZE
CREATE INDEX
CREATE TRIGGER
CREATE VIEW
CREATE VIRTUAL TABLE
CREATE TEMPORARY TABLE
Database
instance
Under the hood, this calls sqlite3_prepare_v3
followed by sqlite3_step
and sqlite3_finalize
.
JavaScript type | SQLite type |
---|---|
string |
TEXT |
number |
INTEGER or DECIMAL |
boolean |
INTEGER (1 or 0) |
Uint8Array |
BLOB |
Buffer |
BLOB |
bigint |
INTEGER |
null |
NULL |
Rest
...bindings: ParamsType[]Optional bindings for the query
Creates a function that always runs inside a transaction. When the function is invoked, it will begin a new transaction. When the function returns, the transaction will be committed. If an exception is thrown, the transaction will be rolled back (and the exception will propagate as usual).
// setup
import { Database } from "bun:sqlite";
const db = Database.open(":memory:");
db.exec(
"CREATE TABLE cats (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER)"
);
const insert = db.prepare("INSERT INTO cats (name, age) VALUES ($name, $age)");
const insertMany = db.transaction((cats) => {
for (const cat of cats) insert.run(cat);
});
insertMany([
{ $name: "Joey", $age: 2 },
{ $name: "Sally", $age: 4 },
{ $name: "Junior", $age: 1 },
]);
The callback which runs inside a transaction
Rest
...args: anyStatic
openStatic
setChange the dynamic library path to SQLite
macOS-only
This only works before SQLite is loaded, so
that's before you call new Database()
.
It can only be run once because this will load the SQLite library into the process.
The path to the SQLite library
Generated using TypeDoc
Open or create a SQLite3 database
Example
Example
Open an in-memory database
Example
Open read-only