Slonik.js Logo
Slonik Logo

Комфортная работа с PostgreSQL в Node.js с Slonik

30 апреля, 2023
1 минута чтения

Установка

npm i --save slonik~22.7.1
npm i --save slonik-interceptor-query-logging~1.3.9
npm i --save-dev eslint-plugin-sql~1.2.1

Настройка .eslintrc

{
  "rules": {
    "sql/format": [
      2,
      {
        "ignoreExpressions": true,
        "ignoreInline": false,
        "ignoreTagless": false
      }
    ],
    "sql/no-unsafe-query": [
      2,
      {
        "allowLiteral": false
      }
    ]
  },
  "plugins": [
    "sql"
  ]
}

Подключение slonik.js

const { createPool } = require('slonik');
const { createQueryLoggingInterceptor } = require('slonik-interceptor-query-logging');

const interceptors = [createQueryLoggingInterceptor()];
export const pool = createPool("YOUR_POSTGRES_CONNECTION_STRING", {
  interceptors,
});

//....

Примеры работы выборки

const { sql } = require('slonik');

await pool.connect(async (connection) => {
      const result = await connection.maybeOne(
sql`SELECT
    *
FROM
    table
    WHERE column = ${'column'}
`
        );
    });
  });

Пример работы с транзакциями

await pool.connect(async (connection) => {
  const result = await connection.transaction(
    async (transactionConnection) => {
      const firstTransaction = await transactionConnection.one(FIRST_SQL);
      const secondTransaction = await transactionConnection.one(SECOND_SQL);
      return transactionConnection.query(QUERY_SQL);
    },
  );
  await connection.query(ANOTHER_SQL);
  return result;
});

Выборка используя Array

Для этого используется sql.array:

`SELECT * 
FROM story 
       WHERE
       ARRAY[${sql.array(categories, 'text')}] @> ARRAY[categories]`

Обновление используя JSON

Для этого используется sql.json:

`UPDATE
    client.passport
SET
    session = ${sql.json(session)}
WHERE
    id = ${id}`

Вставка блобов и временных значений

Для этого используется возможности sql.binary и метка «::timestamptz».

`INSERT INTO story.content
          (
            content,
            created_at
          )
          VALUES (
            ${sql.binary(content)},
            ${date.toUTCString()}::timestamptz
          )
          RETURNING id`

Денис Сергеевич Басковский

Философ, изобретатель и поэт.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
gemini protocol
Предыдущая статья

Протокол Gemini: новый шаг в развитии интернета

Следующая статья

Создаем собственный Transport для Winston