Spec-Zone.ru › Nim

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 (?, ?, ?)"

Примечание: Существует два подхода к поддержке подстановки параметров в этом модуле.

  1. SqlQuery используя ?, ?, ?, ... (то же самое, что и во всех db_* модулях)
  2. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API