Skip to content

SQL

The @std/sql module provides database connection helpers and a database object with query, exec, ping, and close methods.

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let provider = sqlite("app.db")
let db = sql.open(provider)
println(db.ping())
db.close()
NameKindDescription
DBstructDatabase instance type.
openfunctionOpens a database from a SQL provider.
sqlitefunctionCreates a SQLite provider.
mysqlfunctionCreates a MySQL provider.
postgresfunctionCreates a PostgreSQL provider.

Provider functions return connection-provider structs. Pass them to sql.open to create a DB.

Create a SQLite provider from a DSN.

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let provider = sqlite("app.db")
let db = sql.open(provider)
println(db.ping())
db.close()

Relative SQLite file paths are resolved from the current source file directory. SQLite DSNs automatically get shared cache and WAL journal options when they are not already present.

In-memory databases are supported.

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let provider = sqlite(":memory:")
let db = sql.open(provider)
db.exec("CREATE TABLE users (id INTEGER, name TEXT)")
db.close()

Create a MySQL provider.

Arguments:

NameTypeDefault
userstringnone
passwordstringnone
dbnamestringnone
hoststring"127.0.0.0"
portint3306
charsetstring"utf8mb4"
parseTimebooltrue
import sql from "@std/sql"
import mysql from "@std/sql/driver/mysql"
let provider = mysql(
"root",
"password",
"app",
"127.0.0.1",
3306,
"utf8mb4",
true
)
let db = sql.open(provider)
println(db.ping())
db.close()

Create a PostgreSQL provider.

Arguments:

NameTypeDefault
userstringnone
passwordstringnone
dbnamestringnone
hoststring"127.0.0.1"
portint5432
sslmodestring"disable"
timezonestring"UTC"
import sql from "@std/sql"
import postgres from "@std/sql/driver/postgres"
let provider = postgres(
"postgres",
"password",
"app",
"127.0.0.1",
5432,
"disable",
"UTC"
)
let db = sql.open(provider)
println(db.ping())
db.close()

Opens a database from a provider.

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let provider = sqlite("app.db")
let db = sql.open(provider)

Returns: sql.DB

Runs a query and returns a list of dictionaries.

Arguments:

NameTypeDefaultDescription
querystringnoneSQL query.
args[]any[]Query parameters.

Returns: []dict

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let db = sql.open(sqlite(":memory:"))
db.exec("CREATE TABLE users (id INTEGER, name TEXT)")
db.exec("INSERT INTO users (id, name) VALUES (?, ?)", [1, "Martin"])
let rows = db.query("SELECT id, name FROM users WHERE id = ?", [1])
for row in rows {
println(row["id"], row["name"])
}
db.close()

Executes a statement and returns the number of affected rows.

Arguments:

NameTypeDefaultDescription
querystringnoneSQL statement.
args[]any[]Statement parameters.

Returns: int

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let db = sql.open(sqlite(":memory:"))
db.exec("CREATE TABLE users (id INTEGER, name TEXT)")
let affected = db.exec(
"INSERT INTO users (id, name) VALUES (?, ?)",
[1, "Martin"]
)
println(affected)
db.close()

Checks whether the database connection is alive.

Returns: bool

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let db = sql.open(sqlite(":memory:"))
println(db.ping())
db.close()

Closes the database connection.

import sql from "@std/sql"
import sqlite from "@std/sql/driver/sqlite"
let db = sql.open(sqlite(":memory:"))
db.close()
fn createUsersTable(db: sql.DB) void {
db.exec("CREATE TABLE users (id INTEGER, name TEXT)")
}