nimble install db_connector.A higher level PostgreSQL database wrapper. This interface is implemented for other databases also.
See also: db_odbc, db_sqlite, db_mysql.
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 (?, ?, ?)"
Note: There are two approaches to parameter substitution support by this module.
SqlQuery using ?, ?, ?, ... (same as all the db_* modules)SqlPrepared using $1, $2, $3, ...
prepare(db, "myExampleInsert",
sql"""INSERT INTO myTable
(colA, colB, colC)
VALUES ($1, $2, $3)""",
3) Using Unix sockets instead of TCP connection can improve performance up to 30% ~ 175% for some operations.
To use Unix sockets with db_postgres, change the server address to the socket file path:
import std/db_postgres ## Change "localhost" or "127.0.0.1" to the socket file path
let db = db_postgres.open("/run/postgresql", "user", "password", "database")
echo db.getAllRows(sql"SELECT version();")
db.close() The socket file path is operating system specific and distribution specific, additional configuration may or may not be needed on your postgresql.conf. The Postgres server must be on the same computer and only works for Unix-like operating systems.
import db_connector/db_postgres
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") DbConn = PPGconn
InstantRow = object ## used to get a row's
Row = seq[string]
SqlPrepared = distinct 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: [].}proc exec(db: DbConn; query: SqlQuery; args: varargs[string, `$`]) {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}proc exec(db: DbConn; stmtName: SqlPrepared; args: varargs[string]) {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}proc execAffectedRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError, ValueError],
forbids: [].}proc execAffectedRows(db: DbConn; stmtName: SqlPrepared;
args: varargs[string, `$`]): int64 {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError, ValueError],
forbids: [].}proc getAllRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): seq[
Row] {....tags: [ReadDbEffect], raises: [DbError], forbids: [].}proc getAllRows(db: DbConn; stmtName: SqlPrepared; 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 getRow(db: DbConn; stmtName: SqlPrepared; 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 getValue(db: DbConn; stmtName: SqlPrepared; 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, ValueError], forbids: [].}proc insertID(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}RETURNING id to the query, so it only works if your primary key is named id. proc len(row: InstantRow): int {.inline, ...raises: [], tags: [], forbids: [].}proc open(connection, user, password, database: string): DbConn {.
...tags: [DbEffect], raises: [DbError], forbids: [].}opens a database connection. Raises EDb if the connection could not be established.
Clients can also use Postgres keyword/value connection strings to connect.
Example:
con = open("", "", "", "host=localhost port=5432 dbname=mydb") See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING for more information.
proc prepare(db: DbConn; stmtName: string; query: SqlQuery; nParams: int): SqlPrepared {.
...raises: [DbError], tags: [], forbids: [].}SqlPrepared statement. Parameter substitution is done via $1, $2, $3, etc. 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 tryExec(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): bool {.
...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}proc tryInsert(db: DbConn; query: SqlQuery; pkName: string;
args: varargs[string, `$`]): int64 {....tags: [WriteDbEffect],
raises: [DbError, ValueError], forbids: [].}proc tryInsertID(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {.
...tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}RETURNING id to the query, so it only works if your primary key is named id. 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: [].}iterator fastRows(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): Row {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}iterator instantRows(db: DbConn; columns: var DbColumns; query: SqlQuery;
args: varargs[string, `$`]): InstantRow {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}iterator instantRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): InstantRow {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}[]. Returned handle is valid only within iterator body. iterator instantRows(db: DbConn; stmtName: SqlPrepared;
args: varargs[string, `$`]): InstantRow {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}[]. Returned handle is valid only within iterator body. iterator rows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {.
...tags: [ReadDbEffect], raises: [DbError], forbids: [].}fastRows, but slower and safe. iterator rows(db: DbConn; stmtName: SqlPrepared; 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_postgres.html