Преобразует XML-выгрузки ФИАС (ГАР) в SQL, пригодный для импорта в PostgreSQL и MySQL.
- Поддержка трех режимов экспорта:
- schema — генерация запросов на
CREATE TABLE - keys — генерация запросов на
ADD PRIMARY KEY - bulk — генерация запросов на пакетный импорт с использованием
COPY FROM STDIN(PostgreSQL) илиLOAD DATA LOCAL INFILE(MySQL) - upsert — генерация запросов добавление и обновление существующих данных через
INSERT … ON CONFLICT( PostgreSQL) илиINSERT … ON DUPLICATE KEY UPDATE(MySQL)
- schema — генерация запросов на
- Поддержка баз данных:
- PostgreSQL (по умолчанию)
- MySQL
- Настраиваемый размер batch для оптимальной производительности
- Результат можно:
- сохранить в файлы
- передать клиенту БД (psql или mysql) для потокового импорта
# (для linux можно просто скачать из releases)
make buildfias-exporter [flags] <путь-к-выгрузке-ФИАС>| Флаг | По умолчанию | Описание |
|---|---|---|
--mode |
bulk |
Режим экспорта: schema - генерация CREATE TABLE, keys - генерация ADD PRIMARY KEY, bulk - COPY FROM STDIN/LOAD DATA LOCAL INFILE, upsert - INSERT … ON CONFLICT/INSERT … ON DUPLICATE KEY UPDATE. |
--db-type |
postgres |
Тип базы данных: postgres или mysql. |
--db-schema |
public |
Целевая схема базы данных. |
--batch-size |
1000000 |
Количество записей в одном batch. |
--ignore-required |
true | Добавлять ли NOT NULL для use="required" полей. |
docker pull postgres:latest
docker run --name gar-psql \
-p 5432:5432 \
-e POSTGRES_HOST_AUTH_METHOD=trust \
-d postgres:latest
# 1) Создание схемы (если не хотите в public)
echo 'CREATE SCHEMA tmp;' | docker exec -i gar-psql psql -U postgres
# 2) Создание таблиц по схемам
# (по умолчанию без PRIMARY KEY и NOT NULL)
./fias-exporter --db-type postgres --mode schema --db-schema tmp ./example/gar_schemas | docker exec -i gar-psql psql -U postgres -v ON_ERROR_STOP=1
# По какой-то причине этой таблицы нет в gar_schemas
echo 'CREATE TABLE tmp.addhouse_types (
id VARCHAR NOT NULL PRIMARY KEY,
name VARCHAR NOT NULL,
shortname VARCHAR,
"desc" VARCHAR,
updatedate DATE NOT NULL,
startdate DATE NOT NULL,
enddate DATE NOT NULL,
isactive BOOLEAN NOT NULL
);' | docker exec -i gar-psql psql -U postgres
# Быстрый импорт данных в созданные таблицы
./fias-exporter --db-type postgres --mode bulk --db-schema tmp ./example/gar_data | docker exec -i gar-psql psql -U postgres -v ON_ERROR_STOP=1
# Добавление PRIMARY KEY ко всем таблицам (по схемам)
# (после импорта данных)
./fias-exporter --db-type postgres --mode keys --db-schema tmp ./example/gar_schemas | docker exec -i gar-psql psql -U postgres -v ON_ERROR_STOP=1
# Альтернативно: UPSERT
# (будет работать только если созданы PRIMARY KEYS)
./fias-exporter --db-type postgres --mode upsert --db-schema tmp ./example/gar_data | docker exec -i gar-psql psql -U postgres -v ON_ERROR_STOP=1
# Проверка
echo 'SELECT COUNT(*) FROM tmp.addhouse_types;' | docker exec -i gar-psql psql -U postgres -v ON_ERROR_STOP=1docker pull mysql:latest
docker run --name gar-mysql \
-p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
-d mysql:latest
# 1) Создание базы данных (если не хотите в default)
docker exec -i gar-mysql mysql -u root -e "CREATE DATABASE gar;"
# 2) Создание таблиц по схемам
# (по умолчанию без PRIMARY KEY и NOT NULL)
./fias-exporter --db-type mysql --mode schema ./example/gar_schemas | docker exec -i gar-mysql mysql -u root gar
# По какой-то причине этой таблицы нет в gar_schemas
echo 'CREATE TABLE addhouse_types (
id VARCHAR(500) NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
shortname TEXT,
`desc` TEXT,
updatedate DATE NOT NULL,
startdate DATE NOT NULL,
enddate DATE NOT NULL,
isactive BOOLEAN NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;' | docker exec -i gar-mysql mysql -u root gar
# 3) Быстрый импорт данных в созданные таблицы
# TODO: пока не работает
# echo 'SET GLOBAL local_infile = 1;' | docker exec -i gar-mysql mysql -u root
# ./fias-exporter --db-type mysql --mode bulk ./example/gar_data | docker exec -i gar-mysql mysql -u root gar --local-infile=1
# Добавление PRIMARY KEY ко всем таблицам (по схемам)
# (после импорта данных)
./fias-exporter --db-type mysql --mode keys ./example/gar_schemas | docker exec -i gar-mysql mysql -u root gar
# Альтернативно: UPSERT
# (будет работать только если созданы PRIMARY KEYS)
./fias-exporter --db-type mysql --mode upsert ./example/gar_data | docker exec -i gar-mysql mysql -u root gar
# Проверка
echo 'SELECT COUNT(*) FROM addhouse_types;' | docker exec -i gar-mysql mysql -u root gar- Импортировался полный дамп, процесс подробно описан, спасибо Djoongaar
- По умолчанию таблицы создаются без
PRIMARY KEY- чтобы не пересчитывался индекс иNOT NULL- чтобы процесс импорта не прервался из-за ошибок в данных - Если используется
upsert-режим (например для импорта дельты), тоPRIMARY KEYдолжны быть заранее созданы. --ignore-requriedнужен так как вdata-частиесть записи с пустыми колонками в полях сuse="required".- В ходе работы в stderr будет выводиться статистика и вывод от клиента БД
- Процесс лучше запускать с остановкой на ошибках (пример для psql ON_ERROR_STOP=1)
- У "Чувашская Республика" в addr_obj.name "Чувашская Республика -", addr_obj.typename указано "Чувашия", у других республик - "Респ" - ее обычно приходится обработать отдельно.