Это четвертая и последняя часть статьи, в которой приведены примеры создания таблицы fias_AddressObjects в базе данных под управлением PostgreSQL, а также загрузки в нее данных об адресообразующих элементах ФИАС.
После этих шагов вы можете опробовать функции, описанные в разделе первый , второй , И третий частей путем копирования и выполнения сценариев их создания.
Полный текст статьи состоит из 4 частей.
Первая половина этой части статьи содержит комментарии по реализации скриптов создания таблицы адресообразующих элементов и заполнения ее данными.
Второй содержит исходные тексты сценариев.
Тем читателям, которых интересуют только исходные тексты, мы предлагаем сразу перейти к Приложение .
Эпилог
Когда начать
Начать необходимо с посещения официального сайта Федеральной налоговой службы, раздел «Федеральная информационная адресная система» (ФИАС) страница.Загрузите последнее обновление или полную базу данных ФИАС на свой компьютер, если вы только начинаете работать с ФИАС.
Переместите архивный файл в рабочую папку.
Распакуйте файлы архива и найдите файл ADDROBJ.DBF. Далее предполагается, что скачан архив файлов с обновлением ФИАС в формате dbf. Преобразуйте загруженный файл ADDROBJ.DBF в формат csv. Для этого откройте исходный файл с помощью MS Excel и пересохраните его в формате csv, не забыв удалить строку с названиями полей записи.
Далее конвертированный в формат csv будет называться «ADDROBJ24_20161020.csv», где 24 — код Красноярского края, а 20161020 — дата загрузки файла.
Создайте таблицу fias_AddressObjects. Для этого можно использовать скрипт, приведенный в приложение «Создание таблицы адресообразующих элементов ФИАС fias_AddressObjects» .
Загрузка ADDROBJ24_20161020.csv в базу данных
Рис.
7 Непосредственная загрузка данных в таблицу fias_AddressObjects.
Вы можете напрямую загрузить данные из файла ADDROBJ24_20161020.csv в таблицу fias_AddressObjects, как показано на рис.7. Но, к сожалению, простой путь не для нас.
Во-первых, помимо основного списка адресообразующих элементов предоставляется также список адресообразующих элементов, которые необходимо удалить из основного списка (DADDROBJ.DBF); Во-вторых, в основном списке присутствуют разъединения, например, ссылки, которые никуда не ведут, т.е.
в списке нет элемента или записи с указанным в ссылке идентификатором.
Поэтому я не хочу восстанавливать ошибки, которые уже однажды были исправлены.
В-третьих, я не хочу каждый раз работать с полным перечнем адресообразующих элементов ФИАС, а лишь скачивать изменения, которые появляются на официальном сайте ФНС два-три раза в неделю.
Поэтому в процессе загрузки обновления ФИАС используются две временные таблицы:
- fias_AddressObjects_temp – для обновления основного списка адресообразующих элементов;
- fias_DeletedAddressObjects_temp – для записей, которые необходимо удалить из основного списка.
Рис.
8. Предварительная загрузка адресообразующих элементов во временные таблицы.
Далее данные из таблицы fias_AddressObjects_temp используются для замены (UPDATE) значений в существующих записях и добавления (INSERT) вновь созданных записей в основную таблицу.
Подробный текст этих операторов можно найти в разделе «Загрузка обновлений адресообразующих элементов ФИАС в таблицу fias_AddressObjects».
Поскольку в процессе обновления могут возникнуть нарушения целостности, можно загружать записи, в которых следующая (NEXTID) или предыдущая (PREVID) ссылка на запись истории указывает на несуществующую запись.
Такая ситуация весьма вероятна.
Вот, например, данные по результатам загрузки полной базы данных по состоянию на 10 октября 2016 года.
Всего нарушений:
- в значениях NEXTID
- в ПРЕДЫДУЩИХ значениях
После завершения обновления основной таблицы необходимо присвоить значения NULL полям NEXTID или PREVID, где их значения указывают на несуществующую запись.ALTER TABLE IF EXISTS fias_AddressObjects DROP CONSTRAINT IF EXISTS fk_fias_AddressObjects_AddressObjects_PREVID; ALTER TABLE IF EXISTS fias_AddressObjects DROP CONSTRAINT IF EXISTS fk_fias_AddressObjects_AddressObjects_NEXTID.
Например, вот так: UPDATE fias_AddressObjects ao SET NEXTID=NULL
WHERE ao.NEXTID IS NOT NULL AND NOT EXISTS(SELECT * FROM fias_AddressObjects nao WHERE nao.AOID=ao.NEXTID);
UPDATE fias_AddressObjects ao SET PREVID=NULL
Теги: #fias #postgresql #хранимая процедура #postgresql
-
Зачем Тратить Деньги На Юристов?
19 Oct, 24