Библиотека для заполнения БД PostgreSQL начальными данными, сгенерированными псевдослучайным образом.
import seed "github.com/goiste/seed/lib"
go install github.com/goiste/seed@latest
На вход принимает данные ([]byte
) в одном из форматов:
- готовый SQL скрипт;
- файл
json
/yaml
с описанием схем, таблиц и данных.
Возможно добавление парсера для собственного формата входных данных. Собственный парсер должен реализовать метод Parse(data []byte) ([]Schema, error)
- schema: schema_test # схема БД
env_vars: # сессионные переменные
- key: test.user
value: 'seed'
tables:
- name: main # имя таблицы
# первичный ключ (чтобы можно было получить из БД первичные ключи при создании
# и подставить их во внешние ключи других таблиц)
primary_key: id
columns: # поля таблицы
- full_name
- username
- email
- ?hired_at # необязательное поле
- is_active
values: # массив данных в формате "поле: значение"
- username: admin
email: $email:admin # команды для генерации случайных значений, описание ниже
is_active: true
- $repeat: 27 # вставить значение со сгенерированными полями 27 раз
full_name: $name:,fio
username: $one_of:user1,user2,user3 # случайное значение из указанных
email: $email
hired_at: $datetime:2012-12-12T12:00:00,2022-12-12T12:00:00 # timestamp в указанном диапазоне
is_active: $bool:75
- name: second
primary_key: id
foreign_keys: # внешние ключи
- column: user_id # поле текущей таблицы, содержащее внешний ключ
ref_table: main # внешняя таблица
columns:
- user_id
- uuid
- title
- ?40description # необязательное поле с вероятностью заполнения 40%
- address
- ?75phone # необязательное поле с вероятностью заполнения 75%
- amount
- values
values:
- $repeat: 42
# Индекс элемента в списке первичных ключей, полученных при создании внешней таблицы.
# В данном примере будет сгенерирован случайный индекс из диапазона 1-27 (включительно):
# по числу сгенерированных во внешней таблице данных, кроме первого (admin)
user_id: $int:1,27
uuid: $uuid
title: $sentence:2,5
description: $paragraph:2,4
address: $address
phone: $phone
amount: $int:111,222
values: $[,5]float:3,1,3 # массив float длиной от 1 до 5
Внешние ключи указываются в виде индекса элемента в списке первичных ключей, полученных при создании внешней таблицы, поэтому таблицы в файле должны идти в правильном порядке: сначала внешняя, потом ссылающиеся на неё.
Примеры файлов можно посмотреть в директории example
Данные можно генерировать псевдослучайным образом. Для этого используются специальные команды, начинающиеся с $
, за которыми через двоеточие идут аргументы, например: $int:1,100
— целое число в диапазоне от 1 до 100 включительно.
Массив значений обозначается квадратными скобками перед командой: $[от,до]команда:аргументы
, например: $[,3]int:1,7
— массив целых чисел от 1 до 7; длина массива от 1 до 3 элементов
Команда | Описание | Перечень аргументов | Примеры |
---|---|---|---|
$int | Целое 32-разрядное число | Минимальное значение, максимальное значение | $int $int:1,100 $int:,42 $int:3 |
$int64 | Целое 64-разрядное число | См. $int | См. $int |
$float | Число с плавающей точкой | Знаков после запятой (по умолч. 2), минимальное значение, максимальное значение | $float $float:3 $float:,1,10 $float,3 |
$word | 1 слово из набора Lorem ipsum | Не имеет аргументов | $word |
$sentence | Несколько слов из набора Lorem ipsum | Минимальное кол-во слов (по умолч. 3), максимальное кол-во (по умолч. 5) | $sentence $sentence:,10 $sentence:2,2 |
$paragraph | Несколько предложений из слов из набора Lorem ipsum | Минимальное кол-во предложений (по умолч. 1), максимальное кол-во (по умолч. 3) | $paragraph $paragraph:,5 $paragraph:2,2 |
$bool | Булево значение | Вероятность выпадения true в процентах (по умолч. 50) | $bool $bool:75 |
$datetime | Дата и время | Минимальная дата (по умолч. 1970-01-01), максимальная дата (по умолч. "сейчас") Формат: "YYYY-MM-DDThh:mm:ss" |
$datetime $datetime:,2012-12-12T00:00:00 |
$uuid | UUID | Не имеет аргументов | $uuid |
$name | Полное имя в заданном формате [RU] | Пол (по умолч. случайный), формат (по умолч. fio) Варианты пола: m (муж), f (жен) Варианты формата: fl (Имя Фамилия), lf (Фамилия Имя), fio (Фамилия Имя Отчество), iof (Имя Отчество Фамилия) |
$name $name:f $name:,iof |
$user | Имя пользователя | Имя, на основании которого будет сформировано имя пользователя (по умолч. сгенерированные Имя Фамилия, будет преобразовано в i.familija) | $user |
Адрес электронной почты на бесплатном почтовом домене | Имя пользователя для почтового ящика (по умолч. см. $user) | $email $email:admin |
|
$password | Пароль | Не имеет аргументов | $password |
$password_hash | Хеш SHA-256 | Не имеет аргументов | $password_hash |
$phone | Номер телефона в международном формате | Код (по умолч. от 900 до 999), префикс (по умолч. 7) Если префикс 8, код всегда будет 800 |
$phone $phone:812 $phone:,375 |
$address | Почтовый адрес [RU] | Не имеет аргументов | $address |
$region | Регион [RU] | Не имеет аргументов | $region |
$city | Город [RU] | Не имеет аргументов | $city |
$region_code | Код региона [RU] | Не имеет аргументов | $region_code |
$lat | Широта | Не имеет аргументов | $lat |
$lon | Долгота | Не имеет аргументов | $lon |
$url | URL-адрес | Не имеет аргументов | $url |
$company | Название организации [RU] | Не имеет аргументов | $company |
$inn | ИНН юридического лица [RU] | Не имеет аргументов | $inn |
$job_title | Название должности [RU] | Не имеет аргументов | $job_title |
$one_of | Случайный элемент из списка | Список элементов через запятую | $one_of:elem1,elem2 |
Также предусмотрен механизм добавления собственных команд. Для этого необходимо вызвать метод RegisterRandomizerCommands()
, передав команды в виде словаря, ключами которого являются названия команд (без префикса $
), а значениями — функции со следующей сигнатурой: func(fake *ru.RusFaker, args ...string) (any, error)
Например:
import (
...
seed "github.com/goiste/seed/lib"
rnd "github.com/goiste/seed/lib/randomizer"
ru "github.com/goiste/seed/lib/randomizer/providers/ru_RU"
)
...
seeder, _ := seed.NewSeeder(seed.Config{
File: file,
DSN: dsn,
})
seeder.RegisterRandomizerCommands(map[string]rnd.GeneratorFunc{
"big_lorem": func(fake *ru.RusFaker, args ...string) (any, error) {
return fake.Lorem().Text(1800), nil
}
})
seeder.Seed(ctx)
...
Название команды должно содержать только символы A-Za-z0-9._
, регистр учитывается.