SQLite
std/sqlite ofrece bindings de SQLite3 cargados en tiempo de ejecución vía dlopen. sqlite_open(":memory:") crea una base de datos en memoria, sqlite_exec ejecuta sentencias DDL/DML, y sqlite_query devuelve filas como arreglos de strings. No se necesitan dependencias externas — SQLite viene incluido en la mayoría de los sistemas operativos.
Código
// SQLite — in-memory database with SQL queries
import "std/sqlite"
fn main() -> int {
// The handle is an opaque pointer (*int); NULL on failure
let db = sqlite_open(":memory:")
sqlite_exec(db, "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Alice', 30)")
sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Bob', 25)")
sqlite_exec(db, "INSERT INTO users (name, age) VALUES ('Charlie', 35)")
let rows: Array = sqlite_query(db, "SELECT name, age FROM users ORDER BY age")
var i: int = 0
while i < rows.length() {
let row: Array = rows[i]
let name: String = row[0]
let age: String = row[1]
print(name + " is " + age + " years old")
i = i + 1
}
let seniors: Array = sqlite_query(db, "SELECT name FROM users WHERE age >= 30")
print("users 30+: " + int_to_string(seniors.length()))
sqlite_close(db)
return 0
}
Salida
Bob is 25 years old Alice is 30 years old Charlie is 35 years old users 30+: 2
Explicación
sqlite_open devuelve un handle opaco de base de datos (*int, NULL en caso de fallo). La ruta especial ":memory:" crea una base de datos temporal en memoria que se descarta al cerrar el handle. Para almacenamiento persistente, pasar una ruta de archivo como "data.db".
sqlite_query devuelve un arreglo de filas, donde cada fila es un arreglo de valores string (SQLite almacena internamente todos los valores como texto). El orden de las columnas coincide con la cláusula SELECT. sqlite_exec se usa para sentencias que no devuelven datos (CREATE, INSERT, UPDATE, DELETE).
Source: examples/by-example/55-sqlite.nx