src/db_connector/db_postgres
nimble install db_connector. Обёртка для базы данных PostgreSQL более высокого уровня. Этот интерфейс реализован также для других баз данных.
См. также: db_odbc, db_sqlite, db_mysql.
Подстановка параметров
Все db_* модули поддерживают одну и ту же форму подстановки параметров. То есть, используя ? (вопросительный знак) для обозначения места, куда следует поместить значение. Например:
sql"INSERT INTO myTable (colA, colB, colC) VALUES (?, ?, ?)"
Примечание: Существует два подхода к поддержке подстановки параметров в этом модуле.
-
SqlQueryиспользуя?, ?, ?, ...(то же самое, что и во всехdb_*модулях) -
SqlPreparedиспользуя$1, $2, $3, ...
prepare(db, "myExampleInsert",
sql"""INSERT INTO myTable
(colA, colB, colC)
VALUES ($1, $2, $3)""",
3) Сокет Unix
Использование сокетов Unix вместо TCP-соединения может повысить производительность на 30% ~ 175% для некоторых операций.
Для использования сокетов Unix с db_postgres, измените адрес сервера на путь к файлу сокета:
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() Путь к файлу сокета зависит от операционной системы и дистрибутива, дополнительная конфигурация может потребоваться на вашей postgresql.conf. Сервер PostgreSQL должен находиться на том же компьютере и работает только для операционных систем семейства Unix.
Примеры
Открытие соединения с базой данных
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") Импорты
- postgres, db_common, dbutils
Типы
DbConn = PPGconn
- инкапсулирует соединение с базой данных
InstantRow = object ## used to get a row's
- обработчик, который может быть
Row = seq[string]
- строка набора данных. Значения NULL базы данных будут преобразованы в nil.
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: [].}- генерирует исключение DbError.
proc dbQuote(s: string): string {....raises: [], tags: [], forbids: [].}- База данных приводит строку в кавычки.
proc exec(db: DbConn; query: SqlQuery; args: varargs[string, `$`]) {. ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}- выполняет запрос и генерирует исключение EDB, если это не удалось.
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: [].}- выполняет запрос (обычно "UPDATE") и возвращает количество затронутых строк.
proc execAffectedRows(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): int64 {. ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError, ValueError], forbids: [].}- выполняет запрос (обычно "UPDATE") и возвращает количество затронутых строк.
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: [].}- выполняет запрос и возвращает первый столбец первой строки набора данных результатов. Возвращает "" если набор данных не содержит строк или значение в базе данных NULL.
proc getValue(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): string {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- выполняет запрос и возвращает первый столбец первой строки набора данных результатов. Возвращает "" если набор данных не содержит строк или значение в базе данных NULL.
proc insert(db: DbConn; query: SqlQuery; pkName: string; args: varargs[string, `$`]): int64 {....tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}- выполняет запрос (обычно "INSERT") и возвращает сгенерированный идентификатор
proc insertID(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {. ...tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}- выполняет запрос (обычно "INSERT") и возвращает сгенерированный идентификатор для строки. Для Postgre это добавляет
RETURNING idк запросу, поэтому работает только если ваш первичный ключ называетсяid. proc len(row: InstantRow): int {.inline, ...raises: [], tags: [], forbids: [].}- возвращает количество столбцов в строке
proc open(connection, user, password, database: string): DbConn {. ...tags: [DbEffect], raises: [DbError], forbids: [].}-
открывает соединение с базой данных. Генерирует исключение
EDb, если соединение не может быть установлено.Клиенты также могут использовать строки подключения PostgreSQL с ключевыми словами/значениями для подключения.
Пример:
con = open("", "", "", "host=localhost port=5432 dbname=mydb")См. http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING для получения дополнительной информации.
proc prepare(db: DbConn; stmtName: string; query: SqlQuery; nParams: int): SqlPrepared {. ...raises: [DbError], tags: [], forbids: [].}- Создаёт новый
SqlPreparedоператор. Подстановка параметров осуществляется через$1,$2,$3, и т.д. proc setEncoding(connection: DbConn; encoding: string): bool {....tags: [DbEffect], raises: [], forbids: [].}- устанавливает кодировку соединения с базой данных, возвращает true для успеха, false для неудачи.
proc tryExec(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): bool {. ...tags: [ReadDbEffect, WriteDbEffect], raises: [DbError], forbids: [].}- пытается выполнить запрос и возвращает true, если успешно, false в противном случае.
proc tryExec(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): bool {. ...tags: [ReadDbEffect, WriteDbEffect], raises: [], forbids: [].}- пытается выполнить запрос и возвращает true, если успешно, false в противном случае.
proc tryInsert(db: DbConn; query: SqlQuery; pkName: string; args: varargs[string, `$`]): int64 {....tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}- выполняет запрос (обычно "INSERT") и возвращает сгенерированный ID для строки или -1 в случае ошибки.
proc tryInsertID(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): int64 {. ...tags: [WriteDbEffect], raises: [DbError, ValueError], forbids: [].}- выполняет запрос (обычно "INSERT") и возвращает сгенерированный ID для строки или -1 в случае ошибки. Для Postgre это добавляет
RETURNING idк запросу, поэтому работает только если ваш первичный ключ называетсяid. proc unsafeColumnAt(row: InstantRow; index: int): cstring {.inline, ...raises: [], tags: [], forbids: [].}- Возвращает строку cstring для заданного столбца строки
Итераторы
iterator fastRows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- выполняет запрос и итерируется по набору данных результата. Это очень быстро, но потенциально опасно: Если блок цикла for выполняет другой запрос, результаты могут быть неопределёнными. Для PostgreSQL это безопасно.
iterator fastRows(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): Row {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- выполняет запрос и итерируется по набору данных результата. Это очень быстро, но потенциально опасно: Если блок цикла for выполняет другой запрос, результаты могут быть неопределёнными. Для PostgreSQL это безопасно.
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: [].}- то же, что и fastRows, но возвращает обработчик, который можно использовать для получения текста столбца по требованию, используя
[]. Возвращаемый обработчик действителен только внутри тела итератора. iterator instantRows(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): InstantRow {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- то же, что и fastRows, но возвращает обработчик, который можно использовать для получения текста столбца по требованию, используя
[]. Возвращаемый обработчик действителен только внутри тела итератора. iterator rows(db: DbConn; query: SqlQuery; args: varargs[string, `$`]): Row {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- то же, что и
fastRows, но медленнее и безопаснее. iterator rows(db: DbConn; stmtName: SqlPrepared; args: varargs[string, `$`]): Row {. ...tags: [ReadDbEffect], raises: [DbError], forbids: [].}- то же, что и
fastRows, но медленнее и безопаснее.
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/db_postgres.html