Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#!/bin/bash
# Загрузка данных ФИАС из DBF
# Настройки
dbf_path='dbf' # Путь к каталогу с файлами
schema_name='fias.' # Схема БД (с точкой)
username='user'
password='pass'
db_mame='export'
db_host='host'
db_port='5432'
export PGUSER=$username
export PGPASSWORD=$password
# Загружается первая таблица ADDROB01 с созданием в БД
echo 'Загрузка таблицы ADDROBJ...'
pgdbf -s cp866 $dbf_path'/ADDROB01.DBF' | awk '{sub("CREATE TABLE ","CREATE TABLE '$schema_name'"); sub("DROP TABLE IF EXISTS","DROP TABLE IF EXISTS '$schema_name'"); sub("COPY ","COPY '$schema_name'"); sub("timeout=60000","timeout=999999"); print }' | psql -h $db_host -p $db_port -d $db_mame
# Загружаются остальные в цикле
for fn in `find $dbf_path -type f -name "ADDROB*" -not -name "ADDROB01.DBF"`
do
fn_base=`basename "$fn" `
echo "Файл "$fn_base"..."
fn_base=`basename -s .DBF "$fn" | sed 's@[^ ]*@\L&@g'`
pgdbf -CD -s cp866 $fn | awk '{sub("COPY '$fn_base' FROM STDIN","COPY '$schema_name'addrob01 FROM STDIN"); print }' | psql -h $db_host -p $db_port -d $db_mame
done
#######################################
# То же самое с домами
echo 'Загрузка таблицы HOUSE...'
pgdbf -s cp866 $dbf_path'/HOUSE01.DBF' | awk '{sub("CREATE TABLE ","CREATE TABLE '$schema_name'"); sub("DROP TABLE IF EXISTS","DROP TABLE IF EXISTS '$schema_name'"); sub("COPY ","COPY '$schema_name'"); sub("timeout=60000","timeout=999999"); print }' | psql -h $db_host -p $db_port -d $db_mame
for fn in `find $dbf_path -type f -name "HOUSE*" -not -name "HOUSE01.DBF"`
do
fn_base=`basename "$fn" `
echo "Файл "$fn_base"..."
fn_base=`basename -s .DBF "$fn" | sed 's@[^ ]*@\L&@g'`
pgdbf -CD -s cp866 $fn | awk '{sub("COPY '$fn_base' FROM STDIN","COPY '$schema_name'house01 FROM STDIN"); print }' | psql -h $db_host -p $db_port -d $db_mame
done
echo 'OK'
-- таблица addrob сделана по образу и подобию любой таблицы по одному региону
CREATE TABLE public.addrob
(
actstatus numeric(2,0),
aoguid character varying(36),
aoid character varying(36),
aolevel numeric(2,0),
areacode character varying(3),
autocode character varying(1),
centstatus numeric(2,0),
citycode character varying(3),
code character varying(17),
currstatus numeric(2,0),
enddate date,
formalname character varying(120),
ifnsfl character varying(4),
ifnsul character varying(4),
nextid character varying(36),
offname character varying(120),
okato character varying(11),
oktmo character varying(11),
operstatus numeric(2,0),
parentguid character varying(36),
placecode character varying(3),
plaincode character varying(15),
postalcode character varying(6),
previd character varying(36),
regioncode character varying(2),
shortname character varying(10),
startdate date,
streetcode character varying(4),
terrifnsfl character varying(4),
terrifnsul character varying(4),
updatedate date,
ctarcode character varying(3),
extrcode character varying(4),
sextcode character varying(3),
livestatus numeric(2,0),
normdoc character varying(36),
plancode character varying(4),
cadnum character varying(100),
divtype numeric(1,0)
) PARTITION BY LIST (regioncode);
-- добавим партиции к таблиции
ALTER TABLE addrob ATTACH PARTITION addrob01 FOR VALUES IN ('01');
ALTER TABLE addrob ATTACH PARTITION addrob02 FOR VALUES IN ('02');
ALTER TABLE addrob ATTACH PARTITION addrob03 FOR VALUES IN ('03');
...
-- так как в таблицах с домами нет поля с кодом региона, добавим его
ALTER TABLE house01 ADD COLUMN regioncode character varying(2) DEFAULT ('01');
ALTER TABLE house02 ADD COLUMN regioncode character varying(2) DEFAULT ('02');
ALTER TABLE house03 ADD COLUMN regioncode character varying(2) DEFAULT ('03');
ALTER TABLE house04 ADD COLUMN regioncode character varying(2) DEFAULT ('04');
...
-- и тоже объединим
ALTER TABLE house ATTACH PARTITION house01 FOR VALUES IN ('01');
ALTER TABLE house ATTACH PARTITION house02 FOR VALUES IN ('02');
....
Адреса ФИАС в среде PostgreSQL. Часть 4. ЭПИЛОГ