PostgreSQLのFIASアドレス。 パート4。エピローグ

これは記事の4番目と最後の部分で、PostgreSQLを実行しているデータベースにfias_AddressObjectsテーブルを作成し、FIASのアドレス形成要素に関するデータをロードする例を示しています。 これらのアクションの後、 第1部第2部、および第3部で説明されている機能を個別にテストし、スクリプトをコピーおよび実行してそれらを作成できます。











記事全体は4つのパートで構成されています。 記事のこの部分の前半には、アドレス形成要素のテーブルを作成してデータを入力するためのスクリプトの実装に関するコメントが含まれています。 2つ目はソーススクリプトです。



ソースコードのみに興味がある読者のために、すぐに行くことをお勧めします

アプリケーションへ



エピローグ



どこから始めるか



更新ページの連邦情報アドレスシステム(FIAS)セクションの連邦税務サービスの公式Webサイトにアクセスすることから始める必要があります。



FIASを使い始めたばかりの場合は、最新のアップデートまたは完全なFIASデータベースをコンピューターにダウンロードしてください。



アーカイブファイルを作業フォルダーに転送します。 アーカイブファイルを抽出し、ADDROBJ.DBFファイルを見つけます。

さらに、dbf形式のFIAS更新を含むファイルアーカイブがダウンロードされていることを前提としています。

ダウンロードしたADDROBJ.DBFファイルは、csv形式に変換されます。 これを行うには、MS Excelを使用してソースファイルを開き、レコードフィールドの名前を含む行を削除することを忘れずに、csv形式で再保存します。 さらに、csv形式に変換されたファイルは「ADDROBJ24_20161020.csv」と呼ばれます。24はクラスノヤルスク地域のコード、20161020はファイルのアップロード日です。



テーブルfias_AddressObjectsを作成します。 これを行うには、 アプリケーション「FIAS fias_AddressObjectsのアドレス形成要素のテーブルの作成」で提供されるスクリプトを使用できます。



ADDROBJ24_20161020.csvをデータベースにロードする









7データをfias_AddressObjectsテーブルに直接ロードします。



図に示すように、ADDROBJ24_20161020.csvファイルからfias_AddressObjectsテーブルにデータを直接ロードできます。 7。



しかし、残念ながら、簡単な方法は私たちにはありません。



まず、アドレス形成要素のメインリストに加えて、メインリスト(DADDROBJ.DBF)から削除する必要があるアドレス形成要素のリストも提供されます。



次に、メインリストには接続障害が含まれています。たとえば、どこにも通じないリンク、つまり リストには、リンクで指定された識別子を持つ要素またはレコードは含まれません。 したがって、すでに一度修正されたエラーを復元したくありません。



第三に、FIASのアドレス生成要素の完全なリストを使用したくないときはいつでも、連邦税務局の公式ウェブサイトに表示される変更を週に2、3回アップロードするだけです。



したがって、FIAS更新のダウンロードプロセスでは、2つの一時テーブルが使用されます。









8.一時テーブルにアドレス形成要素をプリロードします。



さらに、fias_AddressObjects_tempテーブルのデータは、既存のレコードの値を置換(更新)し、新しく作成されたレコードをメインテーブルに追加(挿入)するのに役立ちます。 これらの演算子の詳細なテキストは、「FIASアドレス生成要素の更新をfias_AddressObjectsテーブルにダウンロードする」セクションにあります。



更新プロセス中に整合性違反が発生する可能性があるため、次の(NEXTID)または前の(PREVID)履歴レコードへの参照が存在しないレコードを示すレコードをダウンロードできます。



この状況は非常にありそうです。 ここでは、たとえば、2016年10月10日時点での完全なデータベースのダウンロード結果に関するデータ。



合計違反:





したがって、メインテーブルを更新する前に、制限を無効にする必要があります。



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.
      
      





メインテーブルを更新した後、値が存在しないレコードを示すNEXTIDまたはPREVIDフィールドにNULL値を割り当てる必要があります。 たとえば、次のように:



 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 WHERE ao.PREVID IS NOT NULL AND NOT EXISTS(SELECT * FROM fias_AddressObjects pao WHERE pao.AOID=ao.PREVID);
      
      





ダウンロードを完了する前に、制限を復元し、一時テーブルを削除します。



付録



FIASアドレスジェネレーターテーブルfias_AddressObjectsの作成



ネタバレ見出し
 BEGIN TRANSACTION; DROP TABLE IF EXISTS fias_AddressObjects; CREATE TABLE IF NOT EXISTS fias_AddressObjects( AOID VARCHAR(36) NOT NULL, PREVID VARCHAR(36) NULL, NEXTID VARCHAR(36) NULL, AOGUID VARCHAR(36) NOT NULL, PARENTGUID VARCHAR(36) NULL, FORMALNAME VARCHAR(120) NULL, SHORTNAME VARCHAR(10) NULL, OFFNAME VARCHAR(120) NULL, POSTALCODE VARCHAR(6) NULL, OKATO VARCHAR(11) NULL, OKTMO VARCHAR(11) NULL, AOLEVEL INTEGER NULL, REGIONCODE VARCHAR(2) NULL, AUTOCODE VARCHAR(1) NULL, AREACODE VARCHAR(3) NULL, CITYCODE VARCHAR(3) NULL, CTARCODE VARCHAR(3) NULL, PLACECODE VARCHAR(3) NULL, STREETCODE VARCHAR(4) NULL, EXTRCODE VARCHAR(4) NULL, SEXTCODE VARCHAR(3) NULL, CODE VARCHAR(17) NULL, PLAINCODE VARCHAR(15) NULL, CURRSTATUS INTEGER NULL, IFNSFL VARCHAR(4) NULL, TERRIFNSFL VARCHAR(4) NULL, IFNSUL VARCHAR(4) NULL, TERRIFNSUL VARCHAR(4) NULL, ACTSTATUS INTEGER NULL, CENTSTATUS INTEGER NULL, STARTDATE TIMESTAMP NULL, ENDDATE TIMESTAMP NULL, UPDATEDATE TIMESTAMP NULL, OPERSTATUS INTEGER NULL, LIVESTATUS INTEGER NULL, NORMDOC VARCHAR(36) NULL, CONSTRAINT XPKfias_AddressObjects PRIMARY KEY (AOID)) WITH (OIDS=False); CREATE INDEX XIE1fias_AddressObjects ON fias_AddressObjects(AOGUID); CREATE INDEX XIE2fias_AddressObjects ON fias_AddressObjects(PARENTGUID); CREATE UNIQUE INDEX XAK1fias_AddressObjects ON fias_AddressObjects(CODE); CREATE INDEX XIE3fias_AddressObjects ON fias_AddressObjects (REGIONCODE,AUTOCODE,AREACODE,CITYCODE,CTARCODE,PLACECODE,STREETCODE,EXTRCODE,SEXTCODE); COMMENT ON TABLE fias_AddressObjects IS 'ADDROBJ (Object)  ,     .'; COMMENT ON COLUMN fias_AddressObjects.AOGUID IS '    '; COMMENT ON COLUMN fias_AddressObjects.FORMALNAME IS ' '; COMMENT ON COLUMN fias_AddressObjects.REGIONCODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.AUTOCODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.AREACODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.CITYCODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.CTARCODE IS '  '; COMMENT ON COLUMN fias_AddressObjects.PLACECODE IS '  '; COMMENT ON COLUMN fias_AddressObjects.STREETCODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.EXTRCODE IS '   '; COMMENT ON COLUMN fias_AddressObjects.SEXTCODE IS '    '; COMMENT ON COLUMN fias_AddressObjects.OFFNAME IS ' '; COMMENT ON COLUMN fias_AddressObjects.POSTALCODE IS ' '; COMMENT ON COLUMN fias_AddressObjects.IFNSFL IS '  '; COMMENT ON COLUMN fias_AddressObjects.TERRIFNSFL IS '    '; COMMENT ON COLUMN fias_AddressObjects.IFNSUL IS '  '; COMMENT ON COLUMN fias_AddressObjects.TERRIFNSUL IS '    '; COMMENT ON COLUMN fias_AddressObjects.OKATO IS ''; COMMENT ON COLUMN fias_AddressObjects.OKTMO IS ''; COMMENT ON COLUMN fias_AddressObjects.UPDATEDATE IS '  () '; COMMENT ON COLUMN fias_AddressObjects.SHORTNAME IS '   '; COMMENT ON COLUMN fias_AddressObjects.AOLEVEL IS '   '; COMMENT ON COLUMN fias_AddressObjects.PARENTGUID IS '   '; COMMENT ON COLUMN fias_AddressObjects.AOID IS '  .  '; COMMENT ON COLUMN fias_AddressObjects.PREVID IS '      '; COMMENT ON COLUMN fias_AddressObjects.NEXTID IS '      '; COMMENT ON COLUMN fias_AddressObjects.CODE IS '          4.0.'; COMMENT ON COLUMN fias_AddressObjects.PLAINCODE IS '     4.0      (  )'; COMMENT ON COLUMN fias_AddressObjects.ACTSTATUS IS '    .     .      . 0 –  , 1 - '; COMMENT ON COLUMN fias_AddressObjects.CENTSTATUS IS ' '; COMMENT ON COLUMN fias_AddressObjects.OPERSTATUS IS '    –    (.   OperationStatus)'; COMMENT ON COLUMN fias_AddressObjects.LIVESTATUS IS '   : 0 –   , 1 - '; COMMENT ON COLUMN fias_AddressObjects.CURRSTATUS IS '   4 (    )'; COMMENT ON COLUMN fias_AddressObjects.STARTDATE IS '  '; COMMENT ON COLUMN fias_AddressObjects.ENDDATE IS '  '; COMMENT ON COLUMN fias_AddressObjects.NORMDOC IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT COUNT(*) FROM fias_AddressObjects;
      
      









FIASアドレス指定要素の更新をfias_AddressObjectsテーブルにダウンロードします



ネタバレ見出し
 BEGIN TRANSACTION; /***********************************************/ /*    */ /**********************************************/ DROP TABLE IF EXISTS fias_AddressObjects_temp; DROP TABLE IF EXISTS fias_DeletedAddressObjects_temp; CREATE TABLE fias_AddressObjects_temp AS SELECT * FROM fias_AddressObjects WHERE AOID IS NULL; CREATE TABLE fias_DeletedAddressObjects_temp AS SELECT * FROM fias_AddressObjects WHERE AOID IS NULL; /**************************************************************/ /*     fias_AddressObjects_temp  */ /*       */ /*************************************************************/ COPY fias_AddressObjects_temp(ACTSTATUS,AOGUID,AOID,AOLEVEL,AREACODE, AUTOCODE,CENTSTATUS,CITYCODE,CODE,CURRSTATUS, ENDDATE,FORMALNAME,IFNSFL,IFNSUL,NEXTID, OFFNAME,OKATO,OKTMO,OPERSTATUS,PARENTGUID, PLACECODE,PLAINCODE,POSTALCODE,PREVID, REGIONCODE,SHORTNAME,STARTDATE,STREETCODE,TERRIFNSFL, TERRIFNSUL,UPDATEDATE,CTARCODE,EXTRCODE,SEXTCODE, LIVESTATUS,NORMDOC) FROM 'W:\Projects\Enisey GIS\DB\SourceData\ADDROBJ24_20161020.csv' WITH (FORMAT csv,DELIMITER ';', ENCODING 'WIN1251'); /**************************************************************/ /*     fias_DeletedAddressObjects_Temp */ /* ,        */ /**************************************************************/ COPY fias_DeletedAddressObjects_Temp(ACTSTATUS,AOGUID,AOID,AOLEVEL,AREACODE, AUTOCODE,CENTSTATUS,CITYCODE,CODE,CURRSTATUS, ENDDATE,FORMALNAME,IFNSFL,IFNSUL,NEXTID, OFFNAME,OKATO,OKTMO,OPERSTATUS,PARENTGUID, PLACECODE,PLAINCODE,POSTALCODE,PREVID, REGIONCODE,SHORTNAME,STARTDATE,STREETCODE,TERRIFNSFL, TERRIFNSUL,UPDATEDATE,CTARCODE,EXTRCODE,SEXTCODE, LIVESTATUS,NORMDOC) FROM 'W:\Projects\Enisey GIS\DB\SourceData\DADDROBJ24_20161020.csv' WITH (FORMAT csv,DELIMITER ';', ENCODING 'WIN1251'); /**************************************************************/ /*   CONSTRAINT. */ /**************************************************************/ 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; /**************************************************************/ /*      fias_DeletedAddressObjects */ /* ,      fias_DeletedAddressObjects_Temp */ /**************************************************************/ UPDATE fias_AddressObjects ao SET ACTSTATUS=t.ACTSTATUS, AOGUID=t.AOGUID, AOLEVEL=t.AOLEVEL, AREACODE=t.AREACODE, AUTOCODE=t.AUTOCODE, CENTSTATUS=t.CENTSTATUS, CITYCODE=t.CITYCODE, CODE=t.CODE, CURRSTATUS=t.CURRSTATUS, ENDDATE=t.ENDDATE, FORMALNAME=t.FORMALNAME, IFNSFL=t.IFNSFL, IFNSUL=t.IFNSUL, NEXTID=t.NEXTID, OFFNAME=t.OFFNAME, OKATO=t.OKATO, OKTMO=t.OKTMO, OPERSTATUS=t.OPERSTATUS, PARENTGUID=t.PARENTGUID, PLACECODE=t.PLACECODE, PLAINCODE=t.PLAINCODE, POSTALCODE=t.POSTALCODE, PREVID=t.PREVID, REGIONCODE=t.REGIONCODE, SHORTNAME=t.SHORTNAME, STARTDATE=t.STARTDATE, STREETCODE=t.STREETCODE, TERRIFNSFL=t.TERRIFNSFL, TERRIFNSUL=t.TERRIFNSUL, UPDATEDATE=t.UPDATEDATE, CTARCODE=t.CTARCODE, EXTRCODE=t.EXTRCODE, SEXTCODE=t.SEXTCODE, LIVESTATUS=t.LIVESTATUS, NORMDOC=t.NORMDOC FROM fias_AddressObjects dao INNER JOIN fias_AddressObjects_temp t ON dao.AOID=t.AOID WHERE ao.AOID=dao.AOID; /**************************************************************/ /*      fias_DeletedAddressObjects , */ /*       fias_DeletedAddressObjects_Temp */ /**************************************************************/ DELETE FROM fias_AddressObjects ao WHERE EXISTS(SELECT 1 FROM fias_DeletedAddressObjects_Temp delao WHERE delao.AOID=ao.AOID); /**************************************************************/ /*       fias_DeletedAddressObjects */ /* ,     fias_DeletedAddressObjects_Temp */ /*  CODE LIKE '24%' ,    ,  */ /*    */ /**************************************************************/ INSERT INTO fias_AddressObjects (ACTSTATUS,AOGUID,AOID,AOLEVEL,AREACODE,AUTOCODE,CENTSTATUS, CITYCODE,CODE,CURRSTATUS,ENDDATE,FORMALNAME,IFNSFL,IFNSUL, NEXTID,OFFNAME,OKATO,OKTMO,OPERSTATUS,PARENTGUID,PLACECODE, PLAINCODE, POSTALCODE,PREVID,REGIONCODE,SHORTNAME,STARTDATE, STREETCODE,TERRIFNSFL,TERRIFNSUL,UPDATEDATE,CTARCODE,EXTRCODE, SEXTCODE,LIVESTATUS,NORMDOC) SELECT ACTSTATUS,AOGUID,AOID,AOLEVEL,AREACODE,AUTOCODE,CENTSTATUS, CITYCODE,CODE,CURRSTATUS,ENDDATE,FORMALNAME,IFNSFL,IFNSUL, NEXTID,OFFNAME,OKATO,OKTMO,OPERSTATUS,PARENTGUID,PLACECODE, PLAINCODE,POSTALCODE,PREVID,REGIONCODE,SHORTNAME,STARTDATE, STREETCODE,TERRIFNSFL,TERRIFNSUL,UPDATEDATE,CTARCODE,EXTRCODE, SEXTCODE,LIVESTATUS,NORMDOC FROM fias_AddressObjects_temp t WHERE CODE LIKE '24%' AND NOT EXISTS(SELECT * FROM fias_AddressObjects ao WHERE ao.AOID=t.AOID) ORDER BY CODE; /**************************************************************/ /*    fias_AddressObjects. */ /*          NULL */ /**************************************************************/ 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 WHERE ao.PREVID IS NOT NULL AND NOT EXISTS(SELECT * FROM fias_AddressObjects pao WHERE pao.AOID=ao.PREVID); /**************************************************************/ /*   CONSTRAINT. */ /**************************************************************/ ALTER TABLE fias_AddressObjects ADD CONSTRAINT fk_fias_AddressObjects_AddressObjects_PREVID FOREIGN KEY(PREVID) REFERENCES fias_AddressObjects (AOID); ALTER TABLE fias_AddressObjects ADD CONSTRAINT fk_fias_AddressObjects_AddressObjects_NEXTID FOREIGN KEY(NEXTID) REFERENCES fias_AddressObjects (AOID); /**************************************************************/ /*      . */ /**************************************************************/ DROP TABLE IF EXISTS fias_AddressObjects_temp; DROP TABLE IF EXISTS fias_DeletedAddressObjects_temp; --ROLLBACK TRANSACTION; COMMIUT TRANSACTION; SELECT COUNT(*) FROM fias_AddressObjects;
      
      







ご清聴ありがとうございました!



All Articles