URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 100044
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Импорт КЛАДР в базу данных PostgreSQL"

Отправлено auto_tips , 14-Ноя-14 09:19 
++ Конвертация КЛАДР (классификатор адресов России) в формат sqlite.

Скачиваем [[http://www.gnivc.ru/inf_provision/classifiers_reference/kladr/ КЛАДР]] с официального сайта

    wget http://www.gnivc.ru/html/gnivcsoft/KLADR/Base.7z

Устанавливаем архиватор 7z

    sudo yum install p7zip

Распаковываем архив

    7za e Base.7z

Устанавливаем sqlite

    sudo yum install sqlite

Устанавливаем sqlite3-dbf

    sudo yum install sqlite3-dbf

Запускаем sqlite3

    sqlite3 my_kladr.db

В sqlite загружаем модуль libspatialite

    .load libspatialite.so.2

Импорт данных из КЛАДР в sqlite

    CREATE VIRTUAL TABLE virt_street_tbl USING VirtualDbf('/home/developer/kladr/STREET.DBF', 'CP866');
    CREATE VIRTUAL TABLE virt_socrbase_tbl USING VirtualDbf('/home/developer/kladr/SOCRBASE.DBF', 'CP866');
    CREATE VIRTUAL TABLE virt_kladr_tbl USING VirtualDbf('/home/developer/kladr/KLADR.DBF', 'CP866');
    CREATE VIRTUAL TABLE virt_flat_tbl USING VirtualDbf('/home/developer/kladr/FLAT.DBF', 'CP866');
    CREATE VIRTUAL TABLE virt_doma_tbl USING VirtualDbf('/home/developer/kladr/DOMA.DBF', 'CP866');
    CREATE VIRTUAL TABLE virt_altnames_tbl USING VirtualDbf('/home/developer/kladr/ALTNAMES.DBF', 'CP866');

    create table street_tbl as select * from virt_street_tbl;
    create table socrbase_tbl as select * from virt_socrbase_tbl;
    create table kladr_tbl as select * from virt_kladr_tbl;
    create table flat_tbl as select * from virt_flat_tbl;
    create table doma_tbl as select * from virt_doma_tbl;
    create table altnames_tbl as select * from virt_altnames_tbl;

    drop table virt_street_tbl;
    drop table virt_socrbase_tbl;
    drop table virt_kladr_tbl;
    drop table virt_flat_tbl;
    drop table virt_doma_tbl;
    drop table virt_altnames_tbl;

Выходим из sqlite

    .exit


Результат: файл my_kladr.db содержит КЛАДР в формате sqlite.


++ Подключение файла my_kladr.db к базе данных PostgreSQL

Скачиваем модуль sqlite_fdw

    wget https://github.com/gleu/sqlite_fdw/archive/master.zip

Устанавливаем unzip

    sudo yum install unzip

Распаковываем архив

    unzip master

Заходим в каталог sqlite_fdw-master

    cd sqlite_fdw-master

Устанавливаем модуль

    sudo PATH=/usr/pgsql-9.3/bin/:$PATH make USE_PGXS=1 install

Входим в систему из под пользователя postgres

    sudo su - postgres

Входим в postgresql

    psql

Выбираем базу данных

    \c YouDatabase

Создаем расширение

    CREATE EXTENSION sqlite_fdw;

Создаем сервер

    CREATE SERVER sqlite_kladr_server
    FOREIGN DATA WRAPPER sqlite_fdw
    OPTIONS (database 'path_to_my_kladr.db');

Создаем схему

    create schema kladr;

Создаем внешние таблицы

    CREATE FOREIGN TABLE kladr.street_tbl(
       id bigint,
       name varchar,
       type varchar,
       code varchar,
       c2 varchar,
       c3 varchar,
       c4 varchar,
       c5 varchar)
    SERVER sqlite_kladr_server
    OPTIONS (table 'street_tbl');

    CREATE FOREIGN TABLE kladr.socrbase_tbl(
       id bigint,
       id1 bigint,
       short_name varchar,
       full_name varchar,
       id3 bigint)
    SERVER sqlite_kladr_server
    OPTIONS (table 'socrbase_tbl');

    CREATE FOREIGN TABLE kladr.kladr_tbl(
       id bigint,
       name varchar,
       type varchar,
       code varchar,
       c4 varchar,
       c5 varchar,
       c6 varchar,
       c7 bigint)
    SERVER sqlite_kladr_server
    OPTIONS (table 'kladr_tbl');

    CREATE FOREIGN TABLE kladr.doma_tbl(
       id bigint,
       house varchar,
       c1 varchar,
       c2 varchar,
       c3 varchar,
       c4 varchar,
       c5 varchar,
       c6 varchar,
       c7 varchar)
    SERVER sqlite_kladr_server
    OPTIONS (table 'doma_tbl');

    CREATE FOREIGN TABLE kladr.altnames_tbl(
       id bigint,
       code1 varchar,
       code2 varchar,
       c1 varchar)
    SERVER sqlite_kladr_server
    OPTIONS (table 'altnames_tbl');

Проверяем работу

    select * from kladr.kladr_tbl limit 10;

Результат: Кладр подключен к базе данных PostgreSQL.

URL:
Обсуждается: http://www.opennet.me/tips/info/2862.shtml


Содержание

Сообщения в этом обсуждении
"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Рамиль , 14-Ноя-14 09:19 
Может поделитесь с практическим применением этого.

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Агр , 14-Ноя-14 13:03 
1. TS: look at your link: 404 NOT FOUND.

2. Результат: стандартизированный классификатор местных адресов можно за полтора часа прикрутить к своему проекту. Как следствие - упрощенное взаимодействие с внешними системами.

3. КЛАДР - это современно, модно, молодёжно!


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено garrick , 14-Ноя-14 14:35 
Я правильно понимаю что в PostgreSQL будет тот же бардак, что и в DBF-файлах КЛАДР? Как на счёт реляционных связей?

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Гость , 14-Ноя-14 14:55 
А что мешает создать кеширующие таблицы с индексами и пуржем, в случае изменения количества записей в dbf?

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено garrick , 14-Ноя-14 15:41 
Как это поможет?
Я про то, что DBF файлы КЛАДР - это совершенно плоские не взаимосвязанные таблицы. Использовать их в таком "чистом" виде в SQL не получится. В сообщении описана процедура загрузки этих таблиц в SQL, но хотелось бы ещё увидеть и алгоритм построения реляционных связей между ними. Иначе не вижу никакой разницы в DBF ли они, в PostgreSQL, Oracle & etc.

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Гость , 14-Ноя-14 19:29 
Эм... моя не понимать тебя.
Есть прилагалище, типа 1Цэ, ему подавай базу в постгресе.
Подключили - профит!

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено garrick , 17-Ноя-14 10:14 
Я в 1С некопенгаген, если оно умеет работать с таблицами КЛАДР "as is", тогда конечно - статья самодостаточна, больше ничего не надо.

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено ананим , 14-Ноя-14 20:05 
Вам учебников по нормализации (и денормализации) мало?

Есть конкретный алгоритм загрузки кладр'а (да и любых данных из dbf по аналогии) в sqlite и postgresql, за что автору и спасибо.
Дальше их крутите/вертите как хотите. Уже средствами самой субд.


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено garrick , 17-Ноя-14 10:16 
> Вам учебников по нормализации (и денормализации) мало?

Вы КЛАДР видели? Представляете как он устроен? Способов его "нормализации" знаю несколько, но хотелось увидеть как это делают другие, так сказать, в плане обмена опытом. Вдруг у кого-то есть более элегантное решение, а я не знаю :(



"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено anonymous , 16-Ноя-14 11:07 
Спасибо за статью!

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено MBG , 16-Ноя-14 16:14 
Как автор утилиты sqlite3-dbf
http://sqlite.mobigroup.ru/wiki?name=sqlite3-dbf
могу сказать
1. Для импорта dbf в постгрес достаточно единственной утилиты
pgdbf  - converter of XBase / FoxPro tables to PostgreSQL
2. sqlite3-dbf здесь вообще не используется - только устанавливается :)
3. Специально для кладр я предоставляю пакет с его SQLite-версией (структура базы оптимизирована для работы, созданы индексы)
http://sqlite.mobigroup.ru/wiki?name=sqlite3-kladr
Также в пакете есть утилиты для быстрого поиска (можно сами запросы посмотреть в исходниках).

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Saniv , 18-Ноя-14 09:42 
КЛАДР - уже не современно :)
Надо пользоваться "Федеральной информационной адресной системой (ФИАС)" http://fias.nalog.ru/

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено garrick , 18-Ноя-14 11:29 
Чем она лучше? В чём разница, кроме формата хранения данных?

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Saniv , 18-Ноя-14 12:36 
Можно поискать в Интернете, например:
http://habrahabr.ru/company/hflabs/blog/230823/

А по личному опыту:
1) В КЛАДРе заменяется код адрес, в итоге имеем плывун. В ФИАСе этот момент учтен.
2) Так как что ФИАС, что КЛАДР, ведется людьми, то имеются переодически кривые данные - то с домами, то еще с чем-нить.


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено дмитрий , 18-Ноя-14 23:28 
скоро эих бюаз не будет, а будет одлна новороссия, и царство Аллаха на юге

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено 9398 , 21-Ноя-14 16:35 
Мне интересно: автор в курсе издержек своих рекомендаций?

«Если Вы ставите программы или драйвера руками в обход системы Portage, например, так:

make install
или используете установщики производителя (nVidia, AMD/ATi и т.п.), то не надо просить помощи на форуме или писать в Gentoo Bugzilla. Вы и только Вы сломали свою систему. Здесь Вам, как говорится, не тут, и тем более не Microsoft® Windows™.
Надеемся, в следующий раз Вы будете умнее и будете ставить все только через Portage!
…»
gentoo.ru/node/14443

Рекомендация тривиальным образом преобразуется для описания произвольного дистрибутива.


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено F , 28-Ноя-14 12:49 
Если какие-то долбодятлы считают, что систему можно сломать нештатной установкой софта, то это еще не значит, что это так. А вообще построение анально огороженной системы - это к эпл и прочим проприетастам (где софт by design только из огороженного маркета).

Вы _можете_ так ставить что угодно, если понимаете, что делаете.


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено nE0sIghT , 05-Дек-14 07:26 
Можете. И даже можете считать себя после таких операций "крутым одмином".

Серьезный подход - это создание пакета в формате используемого пакетного менеджера для требуемого ПО.


"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено crypt , 14-Дек-14 12:55 
да, не... как раз за такими распальцоваными д******и, как ты, потом приходится убирать нормальным админам...

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Гость , 15-Дек-14 12:38 
Зачем писать свой велосипед, если он уже давно написан? Не проще ли воспользоваться уже готовыми решениями от dadata.ru или kladr-api.ru ?

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено Grammar_Nazi , 07-Янв-15 16:49 
"из-под" пишется через дефис

"Импорт КЛАДР в базу данных PostgreSQL"
Отправлено cmp , 17-Фев-15 04:18 
В "стандартных" репах пакета  sqlite3-dbf не нашлось, зато нашелся пакет dbf, который прекрасно справился с задачей, с оговоркой, что нужно использовать опцию --noconv иначе беда с кодировкой.