Заполнение базы данных тестовыми данными
Создавайте реалистичные тестовые данные с помощью INSERT ... SELECT и generate_series и проверяйте их простыми аналитическими запросами
«Заполнение базы данных тестовыми данными» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужны начальные данные?
Пустые базы данных скрывают ошибки. Вам нужны реалистичные данные:
- Чтобы запускать проверки интерфейса и сквозные проверки
- Чтобы проверять характеристики производительности (индексы, планы запросов)
- Чтобы демонстрировать приложение
Начальные данные, заданные вручную
Для небольшого количества «тестовых» строк задайте их вручную в SQL или миграции:
INSERT INTO users (id, email, full_name) VALUES
(1, 'alice@example.com', 'Alice Adams'),
(2, 'bob@example.com', 'Bob Brown');
SELECT setval('users_id_seq', (SELECT MAX(id) FROM users));Генерация последовательности для массовой загрузки
generate_series — Ваш помощник. Создадим 1000 публикаций:
INSERT INTO posts (author_id, title, body, published_at)
SELECT
((random() * 9 + 1)::int), -- random user 1-10
'Post number ' || g,
'Lorem ipsum body ' || g,
NOW() - (random() * INTERVAL '90 days')
FROM generate_series(1, 1000) AS g;Случайные внешние ключи
Выберите случайную родительскую строку:
INSERT INTO comments (post_id, author_id, body)
SELECT
(SELECT id FROM posts ORDER BY random() LIMIT 1),
(SELECT id FROM users ORDER BY random() LIMIT 1),
'Sample comment ' || g
FROM generate_series(1, 5000) AS g;
-- Slow at scale — see next slide for a faster pattern.Быстрее: предварительно кэшируйте родителей
Материализуйте идентификаторы-кандидаты один раз:
WITH u AS (SELECT id FROM users),
p AS (SELECT id FROM posts)
INSERT INTO comments (post_id, author_id, body)
SELECT
(SELECT id FROM p OFFSET floor(random()*1000)::int LIMIT 1),
(SELECT id FROM u OFFSET floor(random()*10)::int LIMIT 1),
'Sample comment ' || g
FROM generate_series(1, 5000) AS g;faker_fdw и инструменты
Для более насыщенных фиктивных данных (имён, адресов, абзацев) используйте:
faker_fdw— расширение PostgreSQL, предоставляющее Python Faker@faker-js/fakerв Node- Средства заполнения начальными данными Django/Rails в виде сценариев
COPY для больших массовых загрузок
Для загрузки миллиона строк COPY в 5–10 раз быстрее INSERT:
COPY users (email, full_name)
FROM '/tmp/seed_users.csv' WITH (FORMAT csv, HEADER true);Сброс последовательностей
Если Вы вручную вставили строки с явно заданными идентификаторами, перемотайте последовательность вперёд, чтобы будущие автоматически создаваемые идентификаторы не конфликтовали:
SELECT setval('users_id_seq', (SELECT COALESCE(MAX(id), 0) FROM users));Идемпотентные начальные данные
Сделайте так, чтобы сценарии можно было безопасно запускать много раз. Используйте UPSERT или TRUNCATE с последующим INSERT:
INSERT INTO products (sku, name, price) VALUES
('A-001', 'Widget', 9.99)
ON CONFLICT (sku) DO UPDATE
SET name = EXCLUDED.name, price = EXCLUDED.price;Реалистичное распределение
Тесты должны отражать структуру рабочей среды. Если у 80% публикаций 0 комментариев, а у 1% — 1000, тестовые данные должны выглядеть так же, иначе планы индексов введут Вас в заблуждение.
Заполнение базы в CI
Для сквозных тестов запустите сценарий заполнения после миграций и до набора тестов. Храните начальные данные в системе контроля версий.
Итоги
Хорошие начальные данные = реалистичные данные + идемпотентный сценарий + быстрая загрузка (COPY для больших объёмов).
- generate_series для массовой загрузки
- UPSERT для повторных запусков
- setval после ручных вставок
- Распределения, соответствующие рабочей среде
Проверка знаний
Вы хотите быстро вставить 10 000 строк тестовых данных. Какая функция PostgreSQL генерирует номера строк?
Часто задаваемые вопросы
Урок «Заполнение базы данных тестовыми данными» бесплатный?
Да — полный текст урока «Заполнение базы данных тестовыми данными» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Заполнение базы данных тестовыми данными»?
Создавайте реалистичные тестовые данные с помощью INSERT ... SELECT и generate_series и проверяйте их простыми аналитическими запросами Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Заполнение базы данных тестовыми данными»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Моделирование блога: пользователи, публикации, комментарии
- Выбор ключей и типов
- Индексы для распространённых запросов
- Заполнение базы данных тестовыми данными