drizzle-kit — сопутствующий CLI-инструмент для генерации и выполнения миграций. В этом руководстве вы опишете таблицу todos на TypeScript, создадите её с помощью миграции drizzle-kit и реализуете обработку запросов на создание, чтение, обновление и удаление в небольшом HTTP-сервере на Node.js. Все соединения защищены TLS с полной проверкой сертификата.
Предварительные требования
- Node.js версии 20 или выше
- Аккаунт ClickHouse Cloud
psqlдля создания базы данных. Вместо этого можно выполнить операторCREATE DATABASEв консоли SQL.
Создание сервиса ClickHouse Managed Postgres
В консоли ClickHouse Cloud нажмите New service и выберите Postgres. Инстанс будет готов через несколько минут. Пошаговое описание процесса см. в руководстве по быстрому старту.Получите сведения о подключении
Нажмите Подключение на левой боковой панели вашего сервиса. В открывшемся модальном окне отображаются имя пользователя, пароль, сервер и порт, а также переключатель Directly / via PgBouncer. В этом руководстве используются две строки подключения:- Прямое подключение (порт
5432) — дляdrizzle-kit. Миграции выполняют DDL, могут работать долго и зависеть от состояния сеанса (например,SET lock_timeout), поэтому они должны обращаться к Postgres напрямую. - PgBouncer (порт
6432) — для приложения. Встроенный PgBouncer работает в режиме пулинга транзакций и позволяет множеству инстансов приложения, включая serverless-функции, совместно использовать небольшое число соединений с Postgres.
sslmode=verify-full&sslrootcert=<service-name>-ca-certificate.pem, а в качестве порта указан 5432. Выберите via PgBouncer, чтобы увидеть сведения о подключении через пул: порт изменится на 6432, а URL всегда будет содержать sslmode=verify-full.
В модальном окне нажмите Download CA certificate. CA‑сертификат также можно скачать в разделе Settings → CA Certificate. Сертификат уникален для вашего инстанса, поэтому с его помощью драйвер может убедиться, что взаимодействует именно с вашим сервером.
Настройка проекта
Создайте проект и установите Drizzle ORM, драйверnode-postgres (pg) и drizzle-kit:
Настройка соединения
Переместите скачанный CA‑сертификат в каталог проекта и переименуйте его вca-certificate.pem.
Создайте базу данных для приложения. Замените <PASSWORD> и хост значениями из модального окна Подключение:
.env в корне проекта или в уже существующий .env. Они отличаются только портом, и обе указывают на базу данных guide_drizzle:
.env
node-postgres считывает sslmode=verify-full и sslrootcert из URL. Библиотека загружает файл CA и проверяет как цепочку сертификатов, так и имя хоста, поэтому писать дополнительный код для TLS не нужно. Путь sslrootcert вычисляется относительно каталога, из которого вы запускаете команды. Не добавляйте .env в систему контроля версий.
Если файл CA отсутствует или указан неверно, установить соединение не удастся: возникнет ошибка
unable to verify the first certificate. Если имя хоста не совпадает с указанным в сертификате, возникнет ошибка ERR_TLS_CERT_ALTNAME_INVALID. Если пароль содержит специальные символы, например @, / или #, закодируйте их в формате URL-encoding.Определите схему
Создайте файлsrc/db/schema.ts:
src/db/schema.ts
drizzle.config.ts в корне проекта. В нём для drizzle-kit указываются путь к схеме и параметры прямого соединения:
drizzle.config.ts
Применение миграций
Сгенерируйте SQL-миграцию на основе схемы:drizzle/0000_init.sql содержит оператор CREATE TABLE. Проверьте его и закоммитьте папку drizzle вместе с остальным кодом. Затем примените миграцию:
drizzle-kit migrate записывает применённые миграции в таблицу drizzle.__drizzle_migrations и при последующих запусках выполняет только новые. После каждого изменения schema.ts снова запускайте generate, а затем migrate.
drizzle-kit push применяет изменения схемы без файлов миграций. Это удобно для прототипирования, но для продакшна лучше использовать generate и migrate: они создают SQL-файлы, доступные для ревью, и сохраняют историю изменений.
Выполнение запросов к базе данных
Создайте файлsrc/db/index.ts. В нём создаётся клиент Drizzle на основе пула node-postgres, который использует соединение через PgBouncer:
src/db/index.ts
src/server.ts — небольшой HTTP-сервер, который выполняет по одному запросу Drizzle на каждый маршрут. В существующем приложении те же запросы db можно вызывать из собственных обработчиков маршрутов:
src/server.ts
Для работы с PgBouncer настраивать драйвер не нужно. Запросы Drizzle по умолчанию используют безымянные операторы, а встроенный PgBouncer в режиме пулинга транзакций также поддерживает именованные подготовленные операторы, например созданные с помощью
.prepare в Drizzle. Возможности уровня сеанса, такие как LISTEN и сеансовые рекомендательные блокировки (advisory locks), через PgBouncer не работают. Подробнее см. в FAQ.Запуск и проверка
Запустите сервер:PATCH возвращает обновлённую строку:
http://localhost:3101/todos в браузере, чтобы получить список оставшихся задач. Ответ будет выглядеть так:
guide_drizzle, затем public и нажмите на таблицу todos. В схеме drizzle хранится таблица истории миграций. В таблице осталась одна строка:
Дальнейшие шаги
- Подключение: строки подключения, PgBouncer и TLS
- Настройки: параметры Postgres и PgBouncer, например
max_connections - Реплики для чтения: масштабирование чтения с помощью
withReplicasв Drizzle - Безопасность: IP Access List и частное сетевое подключение