BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • IO7 Framework vs Laravel 13 — Сравнение
    • Структура
    • Варианты проектов
    • Доступ к участкам проекта
    • Разворачивание нового проекта
    • Установка проекта
    • Запуск локальной разработки
  • API

    • Обзор API
    • IOCore::call() и IOCore::callAction()
    • Создание API
  • CLI

    • Обзор CLI
    • iocli
    • Кастомные CLI команды
  • Работа с базами данных

    • Обзор работы с базами данных
    • Cron / Планировщик задач (Schedule)
    • Фабрики
    • Миграции
    • Сидеры
    • Query Builder
    • Подключение MinIO
    • Подключение MongoDB
    • Подключение MySQL
    • Подключение PostgreSQL
    • Подключение ProxySQL
    • Подключение RabbitMQ
    • Подключение Redis
  • Логирование

    • Обзор логирования
    • IOEvent - Логирование событий
    • Pinba (PinbaManager) - Профилировщик
  • Модели

    • Обзор моделей
    • CRUD операции
    • Связи моделей
  • Очереди

    • Обзор очередей
    • RabbitMQ
  • Маршруты

    • Обзор маршрутов
    • Определение маршрутов
    • Middleware
  • Сессии

    • Обзор сессий
    • Кроссдоменная SSO
    • JWT авторизация
    • Социальная авторизация
    • OAuth2
    • Keycloak
  • Twig

    • Обзор Twig
    • Формы (FormBuilder)
    • Twig функции
  • Тестирование

    • Обзор тестирования
    • Unit тесты
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Вспомогательные функции (Helpers)
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • Core класс
    • Route и работа с ними
    • Request и работа с ними
    • Middleware и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
    • Миграции
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS
    • Хранилище (store)
    • Навигация в хосте
    • Навигация в микрофронтенде
    • Параметры микрофронтенда
    • Проверка полномочий
  • Tailux UI Компоненты

    • Базовый UI

      • AvatarDot
      • Avatar
      • Badge
      • Button
      • Card
      • ConfirmModal
      • Divider
      • Highlight
      • Tag
    • Загрузка

      • Circlebar
      • Progress
      • Skeleton
      • Spinner
    • Навигация

      • Accordion
      • AccordionButton
      • AccordionHeader
      • AccordionItem
      • AccordionPanel
      • AccordionProvider
      • Pagination
      • PaginationControl
      • PaginationItems
      • PaginationDots
      • PaginationFirst
      • PaginationLast
      • PaginationNext
      • PaginationPrevious
    • Отображение данных

      • Box
      • Collapse
      • ContextualHelp
      • ScrollShadow
      • Timeline
      • TimelineItem
    • Элементы таблиц

      • Table
      • CollapsibleSearch
      • ColumnFilter
      • CopyableCell
      • DateFilter
      • FacetedFilter
      • FilterSelector
      • PaginationSection
      • RadioFilter
      • RangeFilter
      • ResponsiveFilter
      • RoleFilter
      • SelectedRowsActions
      • TableColumnVisibility
      • TableSettings
      • TableSortIcon
    • Элементы форм

      • Checkbox
      • Combobox
      • DatePicker
      • Filepond
      • Input
      • Listbox
      • Radio
      • Range
      • Select
      • StyledSwitch
      • Swap
      • SwapOn
      • SwapOff
      • Switch
      • Textarea
      • TextEditor
      • Upload

Подключение PostgreSQL

Внимание

Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!

  • Конфигурация
    • Параметры подключения
  • Подключение через SqlConnection
    • Простое подключение
    • Подключение через connect()
    • Через create_conn()
    • Автоматические настройки после подключения
  • Подключение через DB фасад
    • Базовая инициализация
    • Через существующий PDO
  • Подключение через ConnectionManager
    • Автоматическое определение
    • Ручное создание конфигурации
  • Переменные окружения
  • Отличия от MySQL
    • Особенности в IO7
  • Примеры
    • CRUD операции
    • PostgreSQL-специфичные запросы
    • UPSERT (Insert or Update)
    • Query Builder
    • Транзакции
  • Рекомендации
  • FAQ
    • Как подключиться к PostgreSQL с SSL?
    • Как использовать prepared statements?
    • Как переключить схему?
    • Как использовать JSONB?
    • Как узнать версию PostgreSQL?

Руководство по подключению к PostgreSQL в IO7 фреймворке.

Конфигурация

Параметры подключения

ПараметрЗначение по умолчаниюОбязателенОписание
driverpgsqlДаДрайвер БД
host—ДаАдрес сервера
port5432НетПорт сервера
database—ДаИмя базы данных
username—ДаПользователь
password—ДаПароль
charsetutf8НетКодировка
prefix''НетПрефикс таблиц
schemapublicНетСхема PostgreSQL
sslmodepreferНетРежим SSL

Подключение через SqlConnection

Простое подключение

use IO\Database\SqlConnection;

$db = new SqlConnection('pgsql');
$db->server = 'localhost';
$db->user = 'postgres';
$db->pass = 'password';
$db->db = 'mydb';

if ($db->tryconnect()) {
    echo "Подключено к PostgreSQL!";
}

Подключение через connect()

$db = new SqlConnection('pgsql');
$db->connect('192.168.1.10', 'app_user', 'secret', 'production');

Через create_conn()

$db = SqlConnection::create_conn(
    'localhost',
    'postgres',
    'password',
    'mydb',
    'pgsql'
);

Автоматические настройки после подключения

При подключении к PostgreSQL автоматически выполняются:

SET client_encoding TO 'utf8';
SET timezone TO '+05:00';

Подключение через DB фасад

Базовая инициализация

use IO\Database\DB;

DB::init([
    'driver'    => 'pgsql',
    'host'      => 'localhost',
    'port'      => 5432,
    'database'  => 'mydb',
    'username'  => 'postgres',
    'password'  => 'password',
    'charset'   => 'utf8',
    'prefix'    => '',
    'schema'    => 'public',
    'sslmode'   => 'prefer',
    'options'   => [
        \PDO::ATTR_PERSISTENT => false,
        \PDO::ATTR_TIMEOUT    => 5,
        \PDO::ATTR_ERRMODE    => \PDO::ERRMODE_EXCEPTION,
    ],
]);

Через существующий PDO

$pdo = new PDO(
    'pgsql:host=localhost;port=5432;dbname=mydb',
    'postgres',
    'password'
);

DB::initPdo($pdo, 'pgsql');

Подключение через ConnectionManager

Автоматическое определение

use IO\Database\ConnectionManager;
use IO\Database\DB;

// Установите DB_ENGINE=pgsql в .env
$connections = ConnectionManager::fromConstants();

foreach ($connections as $name => $config) {
    DB::init($config, $name);
}

Ручное создание конфигурации

$config = ConnectionManager::pgsqlConfig(
    '192.168.1.10',
    'mydb',
    'app_user',
    'secret',
    5432
);

DB::init($config, 'main');

Переменные окружения

Файл .env:

# Движок БД
DB_ENGINE=pgsql

# PostgreSQL
PGSQL_HOST=localhost
PGSQL_PORT=5432
PGSQL_USER=postgres
PGSQL_PASSWORD=secret
PGSQL_DB=mydb

Отличия от MySQL

ОсобенностьMySQLPostgreSQL
Порт по умолчанию33065432
Кодировкаutf8mb4utf8
Экранирование имён`table`"table"
Auto-incrementAUTO_INCREMENTSERIAL / GENERATED
UPSERTON DUPLICATE KEY UPDATEON CONFLICT DO UPDATE
INSERT IGNOREINSERT IGNOREON CONFLICT DO NOTHING
Switch databaseUSE db_nameНе поддерживается
ФункцииFOUND_ROWS(), ROW_COUNT()Нет аналогов
RegexRLIKE~

Особенности в IO7

  • usedb() — в PostgreSQL не работает ( silently returns )
  • insert_or_update() — использует ON CONFLICT DO UPDATE
  • insert_or_ignore() — использует ON CONFLICT DO NOTHING
  • escape2() — экранирует имена через двойные кавычки вместо обратных

Примеры

CRUD операции

$db = new SqlConnection('pgsql');
$db->connect('localhost', 'postgres', 'password', 'mydb');

// CREATE
$db->insert('users', [
    'name'  => 'Иван',
    'email' => 'ivan@example.com',
]);

// READ
$r = $db->query("SELECT * FROM users WHERE email = $1", ['ivan@example.com']);
$user = $db->fetch($r);
$db->free_result($r);

PostgreSQL-специфичные запросы

// INSERT ... RETURNING
$r = $db->query(
    "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id",
    ['Мария', 'maria@example.com']
);
$row = $db->fetch($r);
$newId = $row['id'];

// CTE (Common Table Expression)
$r = $db->query("
    WITH active_users AS (
        SELECT * FROM users WHERE active = true
    )
    SELECT * FROM active_users WHERE role = 'admin'
");

// JSON операторы
$r = $db->query("SELECT data->>'name' as name FROM documents WHERE data @> ?", [
    json_encode(['type' => 'report'])
]);

// ARRAY
$r = $db->query("SELECT * FROM users WHERE $1 = ANY(tags)", ['vip']);

UPSERT (Insert or Update)

// PostgreSQL: ON CONFLICT DO UPDATE
$db->insert_or_update('user_stats', [
    'user_id'    => 1,
    'total_logins' => 1,
]);

// Генерируется:
// INSERT INTO "user_stats" ("user_id", "total_logins") VALUES ($1, $2)
// ON CONFLICT DO UPDATE SET "user_id" = EXCLUDED."user_id", "total_logins" = EXCLUDED."total_logins"

Query Builder

$users = SqlConnection::table('users')
    ->where('active', true)
    ->where('age', '>=', 18)
    ->orderBy('name')
    ->limit(25)
    ->get();

// PostgreSQL-специфичные операторы через raw
$users = SqlConnection::table('users')
    ->whereRaw("data->>'role' = ?", ['admin'])
    ->get();

Транзакции

$db->beginTransaction();
try {
    $db->insert('accounts', ['user_id' => 1, 'balance' => 1000]);
    $db->insert('transactions', ['account_id' => 1, 'amount' => 100]);
    $db->commit();
} catch (\Exception $e) {
    $db->rollBack();
    throw $e;
}

Рекомендации

  1. Используйте $1, $2 плейсхолдеры вместо ? для PostgreSQL
  2. Настройте schema если используете не public
  3. Используйте sslmode=require для продакшен-подключений
  4. Используйте ON CONFLICT вместо проверки существования записи
  5. Экранируйте имена через escape2() — PostgreSQL использует двойные кавычки

FAQ

Как подключиться к PostgreSQL с SSL?

$config = ConnectionManager::pgsqlConfig('localhost', 'mydb', 'postgres', 'secret');
$config['sslmode'] = 'require';
$config['options'][\PDO::PGSQL_ATTR_DISABLE_PREPARES] = false;
DB::init($config);

Как использовать prepared statements?

PostgreSQL нативно поддерживает подготовленные выражения:

$r = $db->query("SELECT * FROM users WHERE id = $1 AND status = $2", [1, 'active']);

Как переключить схему?

$db->query("SET search_path TO my_schema, public");

Как использовать JSONB?

// Запись JSONB
$db->insert('documents', [
    'data' => json_encode(['key' => 'value']),
]);

// Запрос по JSONB полю
$r = $db->query("SELECT * FROM documents WHERE data->>'key' = $1", ['value']);

Как узнать версию PostgreSQL?

$version = $db->get_var('version', "SELECT version() as version");
echo "Версия PostgreSQL: {$version}";
Prev
Подключение MySQL
Next
Подключение ProxySQL