pgfixtures (english & russian text)
Starting this blog felt a bit overdue — I’ve been building tools for myself and my teams for years, and now it’s time to share them with the world. So here’s the first one I’d like to talk about: pgfixtures.
If you’ve ever had to load test data into a PostgreSQL or MySQL database for integration tests, you know it can quickly turn into a mess of custom scripts, brittle SQL, and flaky ordering problems. I got tired of that — and built pgfixtures.
It’s a Go library and CLI tool that helps you load fixtures into your database in a clean, declarative way. You write YAML files, define your data, and it takes care of the rest — loading in the right order (even with foreign keys), resetting sequences, supporting dynamic values with SQL expressions like $eval(SELECT NOW()), and even allowing fixture inheritance and templating.
A few features I’m especially proud of:
1) Dynamic values via $eval() — timestamps, randoms, even foreign keys can be generated live.
2) Template inheritance — define a base user once, extend it across dozens of test cases.
3) Multiple includes with merge-by-ID — reuse and override fixture data without repetition.
4) Dry-run mode — see what’s going to be loaded before doing anything.
5) PostgreSQL and MySQL support (yes, both!).
It’s already helped me speed up testing pipelines, make test data more readable, and avoid those annoying “foreign key constraint failed” headaches.
If you're writing integration tests against a database — give it a try. Feedback, ideas, and contributions are more than welcome!
👉 GitHub: rom8726/pgfixtures
👉 Go package: pkg.go.dev
-------
Я давно хотел начать вести блог — за годы накопилось много своих утилит и библиотек, которые экономят время в работе. И вот наконец-то решил начать. Первая библиотека, о которой хочу рассказать, называется pgfixtures.
Если вы когда-нибудь загружали тестовые данные в PostgreSQL или MySQL для интеграционных тестов — вы знаете, насколько это бывает больно. Ручные скрипты, SQL в коде, непонятные ошибки из-за порядка загрузки таблиц… Мне это надоело — и я написал pgfixtures.
Это библиотека и CLI-инструмент на Go, которые позволяют загружать данные в базу из YAML-файлов. Всё просто: описываешь структуру — и данные загружаются в правильном порядке, с учётом внешних ключей, сбросом последовательностей и даже с динамическими значениями вроде $eval(SELECT NOW()).
Вот несколько фич, которыми я особенно горжусь:
1) Динамические значения через $eval() — можно генерировать timestamp'ы, случайные числа, запросы к другим таблицам.
2) Шаблоны и наследование — описываешь базовый объект, наследуешь и переопределяешь поля, без дублирования.
3) Множественные include-файлы с merge по ID — удобно разбивать фикстуры по частям.
4) Dry-run режим — можно посмотреть, что будет загружено, без изменений в базе.
5) Поддержка PostgreSQL и MySQL (да, обе СУБД).
pgfixtures уже помогает мне ускорять тесты, делать данные более читаемыми и избавляться от ошибок с внешними ключами.
Если вы пишете интеграционные тесты к базе данных — попробуйте. Буду рад любому фидбеку, идеям и pull request'ам.
👉 GitHub: rom8726/pgfixtures
👉 Go package: pkg.go.dev