nimble install db_connector.A higher level mySQL database wrapper. The same interface is implemented for other databases too.
See also: db_odbc, db_sqlite, db_postgres.
All db_* modules support the same form of parameter substitution. That is, using the ? (question mark) to signify the place where a value should be placed. For example:
sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)"
import db_connector/db_mysql
let db = open("localhost", "user", "password", "dbname")
db.close() db.exec(sql"DROP TABLE IF EXISTS myTable")
db.exec(sql("""CREATE TABLE myTable (
id integer,
name varchar(50) not null)""")) db.exec(sql"INSERT INTO myTable (id, name) VALUES (0, ?)",
"Dominik") import db_connector/db_mysql
import std/math
let theDb = open("localhost", "nim", "nim", "test")
theDb.exec(sql"Drop table if exists myTestTbl")
theDb.exec(sql("create table myTestTbl (" &
" Id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, " &
" Name VARCHAR(50) NOT NULL, " &
" i INT(11), " &
" f DECIMAL(18,10))"))
theDb.exec(sql"START TRANSACTION")
for i in 1..1000:
theDb.exec(sql"INSERT INTO myTestTbl (name,i,f) VALUES (?,?,?)",
"Item#" & $i, i, sqrt(i.float))
theDb.exec(sql"COMMIT")
for x in theDb.fastRows(sql"select * from myTestTbl"):
echo x
let id = theDb.tryInsertId(sql"INSERT INTO myTestTbl (name,i,f) VALUES (?,?,?)",
"Item#1001", 1001, sqrt(1001.0))
echo "Inserted item: ", theDb.getValue(sql"SELECT name FROM myTestTbl WHERE id=?", id)
theDb.close() DbConn = distinct PMySQL
InstantRow = object
Row = seq[string]
proc `[]`(row: InstantRow; col: int): string {.inline, ...raises: [], tags: [],
forbids: [].}proc close(db: DbConn) {....tags: [DbEffect], raises: [], forbids: [].}proc dbError(db: DbConn) {.noreturn, ...raises: [DbError], tags: [], forbids: [].}proc dbQuote(s: string): string {....raises: [], tags: [], forbids: [].}% and _. proc exec(db: DbConn; query: SqlQuery; args: varargs[string, `$`]) {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}proc execAffectedRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}proc getAllRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): seq[
Row] {....tags: [ReadDbEffect], raises: [DbError], forbids: [].}proc getRow(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}proc getValue(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): string {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}proc insert(db: DbConn; query: SqlQuery; pkName: string;
args: varargs[string, `$`]): int64 {....tags: [WriteDbEffect],
raises: [DbError], forbids: [].}proc insertId(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [WriteDbEffect], raises: [DbError], forbids: [].}proc len(row: InstantRow): int {.inline, ...raises: [], tags: [], forbids: [].}proc open(connection, user, password, database: string): DbConn {.
...tags: [DbEffect], raises: [DbError, ValueError], forbids: [].}EDb if the connection could not be established. proc setEncoding(connection: DbConn; encoding: string): bool {....tags: [DbEffect],
raises: [], forbids: [].}proc tryExec(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): bool {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}proc tryInsert(db: DbConn; query: SqlQuery; pkName: string;
args: varargs[string, `$`]): int64 {....tags: [WriteDbEffect],
raises: [DbError], forbids: [].}proc tryInsertId(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [WriteDbEffect], raises: [DbError], forbids: [].}proc unsafeColumnAt(row: InstantRow; index: int): cstring {.inline, ...raises: [],
tags: [], forbids: [].}iterator fastRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}executes the query and iterates over the result dataset.
This is very fast, but potentially dangerous. Use this iterator only if you require ALL the rows.
Breaking the fastRows() iterator during a loop will cause the next database query to raise an EDb exception Commands out of sync.
iterator instantRows(db: DbConn; columns: var DbColumns; query: SqlQuery;
args: varargs[string, `$`]): InstantRow {.
...raises: [DbError], tags: [], forbids: [].}[]. Returned handle is valid only within the iterator body. iterator instantRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): InstantRow {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}[]. Returned handle is valid only within the iterator body. iterator rows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}fastRows, but slower and safe.
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/db_mysql.html