温馨提示:本站仅提供公开网络链接索引服务,不存储、不篡改任何第三方内容,所有内容版权归原作者所有
AI智能索引来源:http://www.bun.com/reference/bun/sqlite
点击访问原文链接

bun:sqlite module | API Reference | Bun

bun:sqlite module | API Reference | BunBuildDocsReferenceGuidesBlogDiscord/bun:sqliteNconstantsCDatabaseVnativeCSQLiteErrorCStatement

Search the reference...

/

BuildDocsReferenceGuidesBlogDiscord/bun:sqliteNconstantsCDatabaseVnativeCSQLiteErrorCStatement

module

bun:sqlite

The 'bun:sqlite' module is a high-performance SQLite3 driver built directly into Bun. The API is simple, synchronous, and inspired by better-sqlite3, offering a clean and intuitive interface for database operations.

Key features include prepared statements, transactions, both named and positional parameters, datatype conversions (BLOB to Uint8Array), mapping query results to classes, and support for bigint. Multi-query statements can be executed in a single call to database.run().

Performance benchmarks show bun:sqlite is approximately 3-6x faster than better-sqlite3 and 8-9x faster than deno.land/x/sqlite for read queries, making it the fastest SQLite driver available for JavaScript.

namespace constants

Constants from sqlite3.h

This list isn't exhaustive, but some of the ones which are relevant

const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: number
const SQLITE_FCNTL_BUSYHANDLER: number
const SQLITE_FCNTL_CHUNK_SIZE: number
const SQLITE_FCNTL_CKPT_DONE: number
const SQLITE_FCNTL_CKPT_START: number
const SQLITE_FCNTL_CKSM_FILE: number
const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: number
const SQLITE_FCNTL_COMMIT_PHASETWO: number
const SQLITE_FCNTL_DATA_VERSION: number
const SQLITE_FCNTL_EXTERNAL_READER: number
const SQLITE_FCNTL_FILE_POINTER: number
const SQLITE_FCNTL_GET_LOCKPROXYFILE: number
const SQLITE_FCNTL_HAS_MOVED: number
const SQLITE_FCNTL_JOURNAL_POINTER: number
const SQLITE_FCNTL_LAST_ERRNO: number
const SQLITE_FCNTL_LOCK_TIMEOUT: number
const SQLITE_FCNTL_LOCKSTATE: number
const SQLITE_FCNTL_MMAP_SIZE: number
const SQLITE_FCNTL_OVERWRITE: number
const SQLITE_FCNTL_PDB: number
const SQLITE_FCNTL_PERSIST_WAL: number
const SQLITE_FCNTL_POWERSAFE_OVERWRITE: number
const SQLITE_FCNTL_PRAGMA: number
const SQLITE_FCNTL_RBU: number
const SQLITE_FCNTL_RESERVE_BYTES: number
const SQLITE_FCNTL_RESET_CACHE: number
const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: number
const SQLITE_FCNTL_SET_LOCKPROXYFILE: number
const SQLITE_FCNTL_SIZE_HINT: number
const SQLITE_FCNTL_SIZE_LIMIT: number
const SQLITE_FCNTL_SYNC: number
const SQLITE_FCNTL_SYNC_OMITTED: number
const SQLITE_FCNTL_TEMPFILENAME: number
const SQLITE_FCNTL_TRACE: number
const SQLITE_FCNTL_VFS_POINTER: number
const SQLITE_FCNTL_VFSNAME: number
const SQLITE_FCNTL_WAL_BLOCK: number
const SQLITE_FCNTL_WIN32_AV_RETRY: number
const SQLITE_FCNTL_WIN32_GET_HANDLE: number
const SQLITE_FCNTL_WIN32_SET_HANDLE: number
const SQLITE_FCNTL_ZIPVFS: number
const SQLITE_OPEN_AUTOPROXY: number
const SQLITE_OPEN_CREATE: number

Allow creating a new database

const SQLITE_OPEN_DELETEONCLOSE: number
const SQLITE_OPEN_EXCLUSIVE: number
const SQLITE_OPEN_EXRESCODE: number
const SQLITE_OPEN_FULLMUTEX: number
const SQLITE_OPEN_MAIN_DB: number
const SQLITE_OPEN_MAIN_JOURNAL: number
const SQLITE_OPEN_MEMORY: number
const SQLITE_OPEN_NOFOLLOW: number
const SQLITE_OPEN_NOMUTEX: number
const SQLITE_OPEN_PRIVATECACHE: number
const SQLITE_OPEN_READONLY: number

Open the database as read-only (no write operations, no create).

const SQLITE_OPEN_READWRITE: number

Open the database for reading and writing

const SQLITE_OPEN_SHAREDCACHE: number
const SQLITE_OPEN_SUBJOURNAL: number
const SQLITE_OPEN_SUPER_JOURNAL: number
const SQLITE_OPEN_TEMP_DB: number
const SQLITE_OPEN_TEMP_JOURNAL: number
const SQLITE_OPEN_TRANSIENT_DB: number
const SQLITE_OPEN_URI: number
const SQLITE_OPEN_WAL: number
const SQLITE_PREPARE_NO_VTAB: number
const SQLITE_PREPARE_NORMALIZE: number
const SQLITE_PREPARE_PERSISTENT: number
class Database

A SQLite3 database

const db = new Database("mydb.sqlite");
db.run("CREATE TABLE foo (bar TEXT)");
db.run("INSERT INTO foo VALUES (?)", ["baz"]);
console.log(db.query("SELECT * FROM foo").all());
readonly filename: string

The filename passed when new Database() was called

const db = new Database("mydb.sqlite");
console.log(db.filename);
// => "mydb.sqlite"
readonly handle: number

The underlying sqlite3 database handle

In native code, this is not a file descriptor, but an index into an array of database handles

[Symbol.dispose](): void;

Closes the database when using the async resource proposal

using db = new Database("myapp.db");
doSomethingWithDatabase(db);
// Automatically closed when `db` goes out of scope
close(throwOnError?: boolean): void;

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.

@param throwOnError

If true, then the database will throw an error if it is in use

db.close();

This is called automatically when the database instance is garbage collected.

Internally, this calls sqlite3_close_v2.

fileControl(op: number,arg?: number | ArrayBufferViewArrayBufferLike>): number;

See sqlite3_file_control for more information.

fileControl(zDbName: string,op: number,arg?: number | ArrayBufferViewArrayBufferLike>): number;

See sqlite3_file_control for more information.

loadExtension(extension: string,entryPoint?: string): void;

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 Database.setCustomSQLite

Bun chooses the Apple build of SQLite on macOS because it brings a ~50% performance improvement.

@param extension

name/path of the extension to load

@param entryPoint

optional entry point of the extension

prepareReturnType, ParamsType extends SQLQueryBindings | SQLQueryBindings[]>(sql: string,params?: ParamsType): StatementReturnType, ParamsType extends any[] ? ParamsTypeParamsType> : [ParamsType]>;

Compile a SQL query and return a Statement object.

This does not cache the compiled query and does not execute the query.

Under the hood, this calls sqlite3_prepare_v3.

@param sql

The SQL query to compile

@param params

Optional bindings for the query

@returns

A Statement instance

// compile the query
const stmt = db.query("SELECT * FROM foo WHERE bar = ?");
// run the query
stmt.all("baz");
queryReturnType, ParamsType extends SQLQueryBindings | SQLQueryBindings[]>(sql: string): StatementReturnType, ParamsType extends any[] ? ParamsTypeParamsType> : [ParamsType]>;

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.

Under the hood, this calls sqlite3_prepare_v3.

@param sql

The SQL query to compile

@returns

Statment instance

// compile the query
const stmt = db.query("SELECT * FROM foo WHERE bar = ?");
// run the query
stmt.all("baz");

// run the query again
stmt.all();
runParamsType extends SQLQueryBindings[]>(sql: string,...bindings: ParamsType[]): Changes;

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.

Under the hood, this calls sqlite3_prepare_v3 followed by sqlite3_step and sqlite3_finalize.

The following types can be used when binding parameters:

JavaScript typeSQLite typestringTEXTnumberINTEGER or DECIMALbooleanINTEGER (1 or 0)Uint8ArrayBLOBBufferBLOBbigintINTEGERnullNULL

Useful for queries like:

CREATE TABLEINSERT INTOUPDATEDELETE FROMDROP TABLEPRAGMAATTACH DATABASEDETACH DATABASEREINDEXVACUUMEXPLAIN ANALYZECREATE INDEXCREATE TRIGGERCREATE VIEWCREATE VIRTUAL TABLECREATE TEMPORARY TABLE
@param sql

The SQL query to run

@param bindings

Optional bindings for the query

@returns

A Changes object with changes and lastInsertRowid properties

db.run("CREATE TABLE foo (bar TEXT)");
db.run("INSERT INTO foo VALUES (?)", ["baz"]);
// => { changes: 1, lastInsertRowid: 1 }
serialize(name?: string): Buffer;

Save the database to an in-memory Buffer object.

Internally, this calls sqlite3_serialize.

@param name

Name to save the database as

@returns

Buffer containing the serialized database

transactionA extends any[], T>(insideTransaction: (...args: A) => T): (...args: A) => T;

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).

@param insideTransaction

The callback which runs inside a transaction

// 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 },
]);
static deserialize(serialized: ArrayBufferLike | TypedArrayArrayBufferLike>,isReadOnly?: boolean): Database;

Load a serialized SQLite3 database

Internally, this calls sqlite3_deserialize.

@param serialized

Data to load

@returns

Database instance

test("supports serialize/deserialize", () => {
const db = Database.open(":memory:");
db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)");
db.exec('INSERT INTO test (name) VALUES ("Hello")');
db.exec('INSERT INTO test (name) VALUES ("World")');

const input = db.serialize();
const db2 = new Database(input);

const stmt = db2.prepare("SELECT * FROM test");
expect(JSON.stringify(stmt.get())).toBe(
JSON.stringify({
id: 1,
name: "Hello",
}),
);

expect(JSON.stringify(stmt.all())).toBe(
JSON.stringify([
{
id: 1,
name: "Hello",
},
{
id: 2,
name: "World",
},
]),
);
db2.exec("insert into test (name) values ('foo')");
expect(JSON.stringify(stmt.all())).toBe(
JSON.stringify([
{
id: 1,
name: "Hello",
},
{
id: 2,
name: "World",
},
{
id: 3,
name: "foo",
},
]),
);

const db3 = Database.deserialize(input, true);
try {
db3.exec("insert into test (name) values ('foo')");
throw new Error("Expected error");
} catch (e) {
expect(e.message).toBe("attempt to write a readonly database");
}
});
static deserialize(serialized: ArrayBufferLike | TypedArrayArrayBufferLike>,options?: { readonly: boolean; safeIntegers: boolean; strict: boolean }): Database;

Load a serialized SQLite3 database. This version enables you to specify additional options such as strict to put the database into strict mode.

Internally, this calls sqlite3_deserialize.

@param serialized

Data to load

@returns

Database instance

test("supports serialize/deserialize", () => {
const db = Database.open(":memory:");
db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)");
db.exec('INSERT INTO test (name) VALUES ("Hello")');
db.exec('INSERT INTO test (name) VALUES ("World")');

const input = db.serialize();
const db2 = Database.deserialize(input, { strict: true });

const stmt = db2.prepare("SELECT * FROM test");
expect(JSON.stringify(stmt.get())).toBe(
JSON.stringify({
id: 1,
name: "Hello",
}),
);

expect(JSON.stringify(stmt.all())).toBe(
JSON.stringify([
{
id: 1,
name: "Hello",
},
{
id: 2,
name: "World",
},
]),
);
db2.exec("insert into test (name) values ($foo)", { foo: "baz" });
expect(JSON.stringify(stmt.all())).toBe(
JSON.stringify([
{
id: 1,
name: "Hello",
},
{
id: 2,
name: "World",
},
{
id: 3,
name: "baz",
},
]),
);

const db3 = Database.deserialize(input, { readonly: true, strict: true });
try {
db3.exec("insert into test (name) values ($foo)", { foo: "baz" });
throw new Error("Expected error");
} catch (e) {
expect(e.message).toBe("attempt to write a readonly database");
}
});
static open(filename: string,options?: number | DatabaseOptions): Database;

Open or create a SQLite3 databases

@param filename

The filename of the database to open. Pass an empty string ("") or ":memory:" or undefined for an in-memory database.

@param options

defaults to {readwrite: true, create: true}. If a number, then it's treated as SQLITE_OPEN_* constant flags.

This is an alias of new Database()

See Database

static setCustomSQLite(path: string): boolean;

Change the dynamic library path to SQLite

@param path

The path to the SQLite library

class SQLiteError

Errors from SQLite have a name SQLiteError.

readonly byteOffset: number

The UTF-8 byte offset of the sqlite3 query that failed, if known

This corresponds to sqlite3_error_offset.

cause?: unknown

The cause of the error.

code?: string

The name of the SQLite3 error code

"SQLITE_CONSTRAINT_UNIQUE"
errno: number

The SQLite3 extended error code

This corresponds to sqlite3_extended_errcode.

message: stringreadonly name: 'SQLiteError'stack?: stringstatic stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes will affect any stack trace captured after the value has been changed.

If set to a non-number value, or set to a negative number, stack traces will not capture any frames.

static captureStackTrace(targetObject: object,constructorOpt?: Function): void;

Create .stack property on a target object

static isError(value: unknown): value is Error;

Check if a value is an instance of Error

@param value

The value to check

@returns

True if the value is an instance of Error, false otherwise

static prepareStackTrace(err: Error,stackTraces: CallSite[]): any;
class StatementReturnType = unknown, ParamsType extends SQLQueryBindings[] = any[]>

A prepared statement.

This is returned by Database.prepare and Database.query.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");
stmt.all("baz");
// => [{bar: "baz"}]
readonly columnNames: string[]

The names of the columns returned by the prepared statement.

const stmt = db.prepare("SELECT bar FROM foo WHERE bar = ?");

console.log(stmt.columnNames);
// => ["bar"]
readonly columnTypes: null | 'TEXT' | 'INTEGER' | 'FLOAT' | 'BLOB' | 'NULL'[]

The actual SQLite column types from the first row of the result set. Useful for expressions and computed columns, which are not covered by declaredTypes

Returns an array of SQLite type constants as uppercase strings:

"INTEGER" for integer values"FLOAT" for floating-point values"TEXT" for text values"BLOB" for binary data"NULL" for null valuesnull for unknown/unsupported types

Requirements:

Only available for read-only statements (SELECT queries)For non-read-only statements, throws an error

Behavior:

Uses sqlite3_column_type() to get actual data types from the first rowReturns null for columns with unknown SQLite type constants
const stmt = db.prepare("SELECT id, name, age FROM users WHERE id = 1");

console.log(stmt.columnTypes);
// => ["INTEGER", "TEXT", "INTEGER"]

// For expressions:
const exprStmt = db.prepare("SELECT length('bun') AS str_length");
console.log(exprStmt.columnTypes);
// => ["INTEGER"]
readonly declaredTypes: null | string[]

The declared column types from the table schema.

Returns an array of declared type strings from sqlite3_column_decltype():

Raw type strings as declared in the CREATE TABLE statementnull for columns without declared types (e.g., expressions, computed columns)

Requirements:

Statement must be executed at least once before accessing this propertyAvailable for both read-only and read-write statements

Behavior:

Uses sqlite3_column_decltype() to get schema-declared typesReturns the exact type string from the table definition
// For table columns:
const stmt = db.prepare("SELECT id, name, weight FROM products");
stmt.get();
console.log(stmt.declaredTypes);
// => ["INTEGER", "TEXT", "REAL"]

// For expressions (no declared types):
const exprStmt = db.prepare("SELECT length('bun') AS str_length");
exprStmt.get();
console.log(exprStmt.declaredTypes);
// => [null]
readonly native: any

Native object representing the underlying sqlite3_stmt

This is left untyped because the ABI of the native bindings may change at any time.

For stable, typed access to statement metadata, use the typed properties on the Statement class:

columnNames for column namesparamsCount for parameter countcolumnTypes for actual data types from the first rowdeclaredTypes for schema-declared column types
readonly paramsCount: number

The number of parameters expected in the prepared statement.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");
console.log(stmt.paramsCount);
// => 1
[Symbol.dispose](): void;

Calls finalize if it wasn't already called.

[Symbol.iterator](): IterableIteratorReturnType>;all(...params: ParamsType): ReturnType[];

Execute the prepared statement and return all results as objects.

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");

stmt.all("baz");
// => [{bar: "baz"}]

stmt.all();
// => []

stmt.all("foo");
// => [{bar: "foo"}]
asT = unknown>(Class: new (...args: any[]) => T): StatementT, ParamsType>;

Make get and all return an instance of the provided Class instead of the default Object.

@param Class

A class to use

@returns

The same statement instance, modified to return an instance of Class

This lets you attach methods, getters, and setters to the returned objects.

For performance reasons, constructors for classes are not called, which means initializers will not be called and private fields will not be accessible.

Custom class
class User {
rawBirthdate: string;
get birthdate() {
return new Date(this.rawBirthdate);
}
}

const db = new Database(":memory:");
db.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, rawBirthdate TEXT)");
db.run("INSERT INTO users (rawBirthdate) VALUES ('1995-12-19')");
const query = db.query("SELECT * FROM users");
query.as(User);
const user = query.get();
console.log(user.birthdate);
// => Date(1995, 12, 19)
finalize(): void;

Finalize the prepared statement, freeing the resources used by the statement and preventing it from being executed again.

This is called automatically when the prepared statement is garbage collected.

It is safe to call this multiple times. Calling this on a finalized statement has no effect.

Internally, this calls sqlite3_finalize.

get(...params: ParamsType): null | ReturnType;

Execute the prepared statement and return the first result.

If no result is returned, this returns null.

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");

stmt.get("baz");
// => {bar: "baz"}

stmt.get();
// => null

stmt.get("foo");
// => {bar: "foo"}

The following types can be used when binding parameters:

JavaScript typeSQLite typestringTEXTnumberINTEGER or DECIMALbooleanINTEGER (1 or 0)Uint8ArrayBLOBBufferBLOBbigintINTEGERnullNULL
iterate(...params: ParamsType): IterableIteratorReturnType>;

Execute the prepared statement and return an

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

raw(...params: ParamsType): null | Uint8ArrayArrayBufferLike>[][];

Execute the prepared statement and return all results as arrays of Uint8Arrays.

This is similar to values() but returns all values as Uint8Array objects, regardless of their original SQLite type.

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");

stmt.raw("baz");
// => [[Uint8Array(24)]]

stmt.raw();
// => [[Uint8Array(24)]]
run(...params: ParamsType): Changes;

Execute the prepared statement.

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

@returns

A Changes object with changes and lastInsertRowid properties

const insert = db.prepare("INSERT INTO users (name) VALUES (?)");
insert.run("Alice");
// => { changes: 1, lastInsertRowid: 1 }
insert.run("Bob");
// => { changes: 1, lastInsertRowid: 2 }

const update = db.prepare("UPDATE users SET name = ? WHERE id = ?");
update.run("Charlie", 1);
// => { changes: 1, lastInsertRowid: 2 }

The following types can be used when binding parameters:

JavaScript typeSQLite typestringTEXTnumberINTEGER or DECIMALbooleanINTEGER (1 or 0)Uint8ArrayBLOBBufferBLOBbigintINTEGERnullNULL
toString(): string;

Return the expanded SQL string for the prepared statement.

Internally, this calls sqlite3_expanded_sql() on the underlying sqlite3_stmt.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?", "baz");
console.log(stmt.toString());
// => "SELECT * FROM foo WHERE bar = 'baz'"
console.log(stmt);
// => "SELECT * FROM foo WHERE bar = 'baz'"
values(...params: ParamsType): string | number | bigint | boolean | Uint8ArrayArrayBufferLike>[][];

Execute the prepared statement and return the results as an array of arrays.

In Bun v0.6.7 and earlier, this method returned null if there were no results instead of []. This was changed in v0.6.8 to align more with what people expect.

@param params

optional values to bind to the statement. If omitted, the statement is run with the last bound values or no parameters if there are none.

const stmt = db.prepare("SELECT * FROM foo WHERE bar = ?");

stmt.values("baz");
// => [['baz']]

stmt.values();
// => [['baz']]

stmt.values("foo");
// => [['foo']]

stmt.values("not-found");
// => []

The following types can be used when binding parameters:

JavaScript typeSQLite typestringTEXTnumberINTEGER or DECIMALbooleanINTEGER (1 or 0)Uint8ArrayBLOBBufferBLOBbigintINTEGERnullNULL
const native: any

The native module implementing the sqlite3 C bindings

It is lazily-initialized, so this will return undefined until the first call to new Database().

The native module makes no gurantees about ABI stability, so it is left untyped

If you need to use it directly for some reason, please let us know because that probably points to a deficiency in this API.

Type definitionsinterface Changes

An object representing the changes made to the database since the last run or exec call.

changes: number

The number of rows changed by the last run or exec call.

lastInsertRowid: number | bigint

If safeIntegers is true, this is a bigint. Otherwise, it is a number.

interface DatabaseOptions

Options for Database

create?: boolean

Allow creating a new database

Equivalent to constants.SQLITE_OPEN_CREATE

readonly?: boolean

Open the database as read-only (no write operations, no create).

Equivalent to constants.SQLITE_OPEN_READONLY

readwrite?: boolean

Open the database as read-write

Equivalent to constants.SQLITE_OPEN_READWRITE

safeIntegers?: boolean

When set to true, integers are returned as bigint types.

When set to false, integers are returned as number types and truncated to 52 bits.

strict?: boolean

When set to false or undefined:

Queries missing bound parameters will NOT throw an errorBound named parameters in JavaScript need to exactly match the SQL query.
const db = new Database(":memory:", { strict: false });
db.run("INSERT INTO foo (name) VALUES ($name)", { $name: "foo" });

When set to true:

Queries missing bound parameters will throw an errorBound named parameters in JavaScript no longer need to be $, :, or @. The SQL query will remain prefixed.
type SQLQueryBindings = string | bigint | NodeJS.TypedArray | number | boolean | null | Recordstring, string | bigint | NodeJS.TypedArray | number | boolean | null>

Resources

ReferenceDocsGuidesDiscordMerch StoreGitHubBlog 

Toolkit

RuntimePackage managerTest runnerBundlerPackage runner

Project

Bun 1.0Bun 1.1Bun 1.2Bun 1.3RoadmapContributingLicense

Baked with ❤️ in San Francisco

We're hiring →

bun:sqlite module | API Reference | Bun,AI智能索引,全网链接索引,智能导航,网页索引

    The