├── .gitignore ├── README.md ├── docker-compose.yml ├── import.sh ├── import_table.sh ├── index.sh ├── indexes.sql ├── schema.json ├── update_schema.py └── update_schema.sql /.gitignore: -------------------------------------------------------------------------------- 1 | *.dbf 2 | *.dbt 3 | data/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Импорт данных из ФИАС в Postgresql 2 | 3 | **NOTE**: данный набор скриптов поддерживается [сообществом](https://github.com/asyncee/fias2pgsql/graphs/contributors) через PR и issues. 4 | 5 | ### Установка 6 | 7 | Просто склонируйте текущую версию  ветки master. 8 | 9 | ### Правила принятия Pull Request 10 | 11 | Все PR вливаются в ветку **master**. Каждый PR проходит ревью методом пристального взгляда. Пожалуйста, убедитесь в работоспособности своих изменений! 12 | 13 | Если вы чувствуете, что готовы поддерживать этот проект, делать ревью и тестировать предлагаемые изменения — пишите. 14 | 15 | ### Краткое описание 16 | 17 | Все манипуляции проводились на [postgresql](https://www.postgresql.org/) версии 11.x.x, однако всё должно 18 | работать и на младших версиях, вплоть до 9.x.x. 19 | 20 | Краткая суть импорта данных заключается в следующем: 21 | 22 | 1. Импорт данных из *\*.dbf* файлов в postgresql используя утилиту *pgdbf v0.6.2*. 23 | 2. Приведение полученной схемы данных в надлежащее состояние, в т.ч. изменение типа данных колонок. 24 | 3. Удаление исторических данных (неактуальных адресных объектов) - опционально, см. пункт 6 секции "Использование" 25 | 4. Создание индексов 26 | 27 | 28 | В скрипте импортируются только следующие таблицы: 29 | 30 | - ``addrobj`` - Классификатор адресообразующих элементов (край > область > 31 | город > район > улица) 32 | - ``socrbase`` - Типы адресных объектов (условные сокращения и уровни 33 | подчинения) 34 | 35 | Если необходимо импортировать и другие данные, то это можно сделать с помощью 36 | скрипта ``import_table.sh``, которому параметром нужно передать имя файла без цифр/расширения. 37 | Пример использования: 38 | ``` 39 | sh import_table.sh ACTSTAT 40 | sh import_table.sh ROOM 41 | ``` 42 | 43 | 44 | ### Использование 45 | 46 | Используемые переменные окружения: 47 | 48 | `$POSTGRES_DB` - имя БД, в которую будет осуществлён импорт 49 | 50 | `$POSTGRES_USER` - имя юзера, от имени которого будет осуществлён импорт 51 | 52 | `$POSTGRES_PASSWORD` - пароль для `$POSTGRES_USER` к БД 53 | 54 | `$POSTGRES_HOST` - хост БД 55 | 56 | `$POSTGRES_PORT` - порт БД 57 | 58 | `$PATH_TO_DBF_FILES` - абсолютный путь к файлам *\*.dbf* 59 | 60 | По умолчанию переменные окружения не задаются, их необходимо указать самостоятельно. 61 | 62 | Алгоритм действий: 63 | 64 | 1. Развернуть БД postgres. Это можно сделать с помощью 65 | [docker-compose.yml](https://github.com/Hedgehogues/fias2pgsql/blob/master/docker-compose.yml), который присутствует в 66 | репозитории или непосредственно поднять БД руками. Для того, чтобы воспользоваться *docker-compose*, потребуется 67 | [docker](https://www.docker.com/) и [docker-compose](https://docs.docker.com/compose/install/). После установки следует запустить контейнер с postgres-11: 68 | 69 | ``` 70 | docker-compose up 71 | ``` 72 | 73 | *Замечание*: настоятельно рекомендуется отказаться от использования докера на боевом сервере для базы. Если 74 | всё-таки принято решение использовать докер, ознакомьтесь с [этим](https://ru.stackoverflow.com/questions/712931/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA-postgresql-%D0%B2-docker/779716#779716) и 75 | [этим](https://toster.ru/q/534239) материалами. В данном случае докер — возможность быстро опробовать наши утилиты. 76 | 77 | 2. Вам также потребуется клиент к postgres-11, pgdbf: 78 | 79 | ``` 80 | sudo apt-get install postgresql-client pgdbf 81 | ``` 82 | 83 | В результате, будет доступна утилита `psql`. Присоединиться к БД можно так: 84 | 85 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB 86 | 87 | 3. Скачать [архив](https://fias.nalog.ru/Updates.aspx) с DBF-файлами сайта ФИАС. Он весит примерно 6 ГБ на момент 88 | обновления 89 | 4. Распаковать его в любую директорию 90 | 5. ВМЕСТО ПУНКТОВ 4,6,7 (если не требуется пункт 5) можно выполнить (либо использовать кастомные настройки): 91 | 92 | ``` 93 | POSTGRES_DB=test_db POSTGRES_USER=test POSTGRES_PASSWORD=test POSTGRES_HOST=localhost POSTGRES_PORT=5432 PATH_TO_DBF_FILES=/absolute/path/to/your/files/ bash ./index.sh 94 | ``` 95 | 96 | 6. Создать бд и провести начальный импорт данных: 97 | 98 | ``` 99 | POSTGRES_DB=test_db POSTGRES_USER=test POSTGRES_PASSWORD=test POSTGRES_HOST=localhost POSTGRES_PORT=5432 PATH_TO_DBF_FILES=/absolute/path/to/your/files/ bash ./import.sh 100 | 101 | ``` 102 | 103 | 7. Если нужно, изменить настройки обновления схемы данных в schema.json и 104 | выполнить скрипт ``update_schema.py``. Это создаст обновлённый файл 105 | ``update_schema.sql``. 106 | 107 | 8. Обновить схему данных: 108 | 109 | ``` 110 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -f update_schema.sql 111 | ``` 112 | 113 | 9. Удалить неактуальные данные и создать индексы:: 114 | 115 | ``` 116 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -f indexes.sql 117 | ``` 118 | 119 | 10. Проверить скорость выполнения следующих запросов:: 120 | 121 | ``` 122 | -- вывести полный адрес 123 | WITH RECURSIVE child_to_parents AS ( 124 | SELECT addrobj.* FROM addrobj 125 | WHERE aoguid = '0c5b2444-70a0-4932-980c-b4dc0d3f02b5' 126 | UNION ALL 127 | SELECT addrobj.* FROM addrobj, child_to_parents 128 | WHERE addrobj.aoguid = child_to_parents.parentguid 129 | AND addrobj.currstatus = 0 130 | ) 131 | SELECT * FROM child_to_parents ORDER BY aolevel; 132 | 133 | -- поиск по части адреса 134 | SELECT * FROM addrobj WHERE formalname ILIKE '%Ульян%'; 135 | ``` 136 | 137 | ### Проблемы и ошибки 138 | 139 | На текущий момент, во время импорта БД, Вы можете столкнуться с проблемами следующего вида: 140 | 141 | ``` 142 | > psql:update_schema.sql:48: ERROR: invalid input syntax for type date: "" 143 | > LINE 1: UPDATE addrobj SET startdate = NULL WHERE startdate = ''; 144 | 145 | > NOTICE: table "addrob??" does not exist, skipping 146 | 147 | > psql:indexes.sql:2: ERROR: extension "pg_trgm" already exists 148 | 149 | > psql:.: ERROR: invalid input syntax for type date: "" 150 | > LINE 1: UPDATE addrobj SET enddate = NULL WHERE enddate = ''; 151 | ``` 152 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | db: 4 | restart: always 5 | image: "postgres:11" 6 | container_name: "atm_postgres" 7 | environment: 8 | - POSTGRES_USER=test 9 | - POSTGRES_PASSWORD=test 10 | - POSTGRES_DB=test_db 11 | ports: 12 | - '5432:5432' 13 | volumes: 14 | - ./data/my_dbdata:/var/lib/postgresql/data 15 | -------------------------------------------------------------------------------- /import.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "++++++++++++++++++ HELLO, DB = $POSTGRES_DB" 4 | 5 | echo '++++++++++++++++++ SOCRBASE TABLE CREATED' 6 | echo 7 | pgdbf $PATH_TO_DBF_FILES/SOCRBASE.DBF | iconv -f cp866 -t utf-8 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB 8 | 9 | echo '++++++++++++++++++ CHECKING ADDROBJ FILES' 10 | if [ -f $PATH_TO_DBF_FILES/ADDROB01.DBF ]; then 11 | mv $PATH_TO_DBF_FILES/ADDROB01.DBF $PATH_TO_DBF_FILES/ADDROBJ.DBF 12 | echo '++++++++++++++++++ ADDROBJ INITIAL FILE MOVED' 13 | fi 14 | pgdbf $PATH_TO_DBF_FILES/ADDROBJ.DBF | iconv -f cp866 -t utf-8 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB 15 | echo '++++++++++++++++++ INITIAL ADDROBJ TABLE CREATED' 16 | 17 | 18 | for FULLPATH in `find $PATH_TO_DBF_FILES/ADDROB* -type f` 19 | do 20 | FILE="${FULLPATH##*/}" 21 | TABLE="${FILE%.*}" 22 | 23 | if [ $TABLE = 'ADDROBJ' ]; then 24 | echo 'SKIPPING ADDROBJ' 25 | else 26 | pgdbf $FULLPATH | iconv -f cp866 -t utf-8 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB 27 | echo "++++++++++++++++++ TABLE $TABLE CREATED" 28 | 29 | echo "++++++++++++++++++ INSERT $TABLE DATA INTO ADDROBJ" 30 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -c "INSERT INTO addrobj SELECT * FROM $TABLE; DROP TABLE $TABLE;" 31 | fi 32 | 33 | done 34 | -------------------------------------------------------------------------------- /import_table.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "++++++++++++++++++ HELLO, DB = $POSTGRES_DB" 4 | 5 | TBL_TO_LOAD=$1 6 | 7 | echo "++++++++++++++++++ LOADING TABLE = $TBL_TO_LOAD" 8 | 9 | first_loop_flag=true 10 | 11 | for FULLPATH in `find $PATH_TO_DBF_FILES/$TBL_TO_LOAD* -type f` 12 | do 13 | FILE="${FULLPATH##*/}" 14 | TABLE="${FILE%.*}" 15 | 16 | pgdbf $FULLPATH | iconv -f cp866 -t utf-8 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB 17 | echo "++++++++++++++++++ TEMP TABLE $TABLE LOADED" 18 | 19 | if [[ "$first_loop_flag" = true ]]; then 20 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -c "CREATE TABLE IF NOT EXISTS $TBL_TO_LOAD AS SELECT * FROM $TABLE WHERE 0 = 1;" 21 | echo "++++++++++++++++++ TARGET TABLE $TBL_TO_LOAD CREATED" 22 | first_loop_flag=false 23 | fi 24 | 25 | echo "++++++++++++++++++ INSERT $TABLE DATA INTO $TBL_TO_LOAD" 26 | 27 | if [[ "$TABLE" != "$TBL_TO_LOAD" ]]; then 28 | echo "++++++++++++++++++ DROP TABLE $TABLE" 29 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -c "INSERT INTO $TBL_TO_LOAD SELECT * FROM $TABLE;" 30 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -c "DROP TABLE $TABLE;" 31 | fi 32 | 33 | done 34 | -------------------------------------------------------------------------------- /index.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | echo '_______________________НАЧИНАЮ ИМПОРТ ИЗ ФАЙЛОВ__________________' 3 | bash ./$(dirname $0)/import.sh 4 | 5 | echo '_______________________НАЧИНАЮ ОБНОВЛЕНИЕ СХЕМЫ__________________' 6 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -f ./$(dirname $0)/update_schema.sql 7 | 8 | echo '_______________________НАЧИНАЮ СОЗДАНИЕ ИНДЕКСОВ_________________' 9 | psql postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB -f ./$(dirname $0)/indexes.sql 10 | 11 | echo '_______________________ _________ГОТОВО________ _________________' 12 | -------------------------------------------------------------------------------- /indexes.sql: -------------------------------------------------------------------------------- 1 | -- extension to implement trigrams; 2 | CREATE EXTENSION pg_trgm; 3 | 4 | 5 | -- drop irrelevant data 6 | DELETE FROM addrobj WHERE livestatus != 1 AND currstatus != 0; 7 | 8 | 9 | --========== SOCRBASE ==========-- 10 | 11 | -- primary key (shortname) 12 | -- ALTER TABLE socrbase DROP CONSTRAINT socrbase_pkey; 13 | ALTER TABLE socrbase ADD CONSTRAINT socrbase_pkey PRIMARY KEY(kod_t_st); 14 | 15 | CREATE UNIQUE INDEX kod_t_st_idx ON socrbase USING btree (kod_t_st); 16 | CREATE INDEX scname_level_idx ON socrbase USING btree (scname, level); 17 | 18 | 19 | --========== ADDROBJ ==========-- 20 | 21 | 22 | -- primary key (aoguid) 23 | -- ALTER TABLE addrobj DROP CONSTRAINT addrobj_pkey; 24 | ALTER TABLE addrobj ADD CONSTRAINT addrobj_pkey PRIMARY KEY(aoguid); 25 | 26 | 27 | -- foreign key (parentguid to aoguid) 28 | -- ALTER TABLE addrobj DROP CONSTRAINT addrobj_parentguid_fkey; 29 | ALTER TABLE addrobj 30 | ADD CONSTRAINT addrobj_parentguid_fkey FOREIGN KEY (parentguid) 31 | REFERENCES addrobj (aoguid) MATCH SIMPLE 32 | ON UPDATE CASCADE ON DELETE NO ACTION; 33 | 34 | 35 | -- create btree indexes 36 | CREATE UNIQUE INDEX aoguid_pk_idx ON addrobj USING btree (aoguid); 37 | CREATE UNIQUE INDEX aoid_idx ON addrobj USING btree (aoid); 38 | CREATE INDEX parentguid_idx ON addrobj USING btree (parentguid); 39 | CREATE INDEX currstatus_idx ON addrobj USING btree (currstatus); 40 | CREATE INDEX aolevel_idx ON addrobj USING btree (aolevel); 41 | CREATE INDEX formalname_idx ON addrobj USING btree (formalname); 42 | CREATE INDEX offname_idx ON addrobj USING btree (offname); 43 | CREATE INDEX shortname_idx ON addrobj USING btree (shortname); 44 | CREATE INDEX shortname_aolevel_idx ON addrobj USING btree (shortname, aolevel); 45 | 46 | 47 | -- trigram indexes to speed up text searches 48 | CREATE INDEX formalname_trgm_idx on addrobj USING gin (formalname gin_trgm_ops); 49 | CREATE INDEX offname_trgm_idx on addrobj USING gin (offname gin_trgm_ops); 50 | -------------------------------------------------------------------------------- /schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "process_tables": ["addrobj", "socrbase"], 3 | "schema": { 4 | "actstat": { 5 | "convert": { 6 | "actstatid": "int" 7 | } 8 | }, 9 | "addrobj": { 10 | "null": [ 11 | "nextid", 12 | "previd", 13 | "terrifnsfl", 14 | "terrifnsul", 15 | "ifnsfl", 16 | "ifnsul", 17 | "normdoc", 18 | "parentguid", 19 | "okato", 20 | "oktmo", 21 | "postalcode" 22 | ], 23 | "convert": { 24 | "aoguid": "uuid", 25 | "aoid": "uuid", 26 | "parentguid": "uuid", 27 | "nextid": "uuid", 28 | "previd": "uuid", 29 | "normdoc": "uuid", 30 | 31 | "actstatus": "int", 32 | "aolevel": "int", 33 | "centstatus": "int", 34 | "currstatus": "int", 35 | "operstatus": "int", 36 | "livestatus": "int" 37 | } 38 | }, 39 | "centerst": { 40 | "convert": { 41 | "centerstid": "int" 42 | } 43 | }, 44 | "curentst": { 45 | "convert": { 46 | "curentstid": "int" 47 | } 48 | }, 49 | "eststat": { 50 | "convert": { 51 | "eststatid": "int" 52 | } 53 | }, 54 | "hststat": { 55 | "convert": { 56 | "hststatid": "int" 57 | } 58 | }, 59 | "intvstat": { 60 | "convert": { 61 | "intvstatid": "int" 62 | } 63 | }, 64 | "ndoctype": { 65 | "convert": { 66 | "ndtypeid": "int" 67 | } 68 | }, 69 | "operstat": { 70 | "convert": { 71 | "operstatid": "int" 72 | } 73 | }, 74 | "socrbase": { 75 | "convert": { 76 | "level": "int" 77 | } 78 | }, 79 | "strstat": { 80 | "convert": { 81 | "strstatid": "int" 82 | } 83 | } 84 | } 85 | } 86 | 87 | -------------------------------------------------------------------------------- /update_schema.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | #!/usr/bin/env python 3 | 4 | import json 5 | 6 | 7 | update_column_sql = """ 8 | -- cast column {table}.{column} to {cast} 9 | BEGIN; 10 | alter table {table} rename column {column} to {column}_x; 11 | alter table {table} add column {column} {cast}; 12 | update {table} set {column} = {column}_x::{cast}; 13 | alter table {table} drop column {column}_x; 14 | COMMIT; 15 | """ 16 | 17 | replace_empty_sql = """ 18 | --- update empty values for {table}.{column} 19 | UPDATE {table} SET {column} = NULL WHERE {column} = ''; 20 | """ 21 | 22 | 23 | def update_column(table, column, cast): 24 | """Привести данные в столбце к нужному типу данных.""" 25 | return update_column_sql.format(table=table, column=column, cast=cast) 26 | 27 | 28 | def null(table, column): 29 | """Установить пустые значения в колонке в NULL.""" 30 | return replace_empty_sql.format(table=table, column=column) 31 | 32 | 33 | if __name__=='__main__': 34 | 35 | sql = [] 36 | 37 | spec = json.load(open('schema.json', 'r')) 38 | tables_to_process = spec['process_tables'] 39 | for table, task in spec['schema'].items(): 40 | if table in tables_to_process: 41 | sql.append( 42 | "\n--============ {} ============--\n".format(table.upper())) 43 | for column in task.get('null', []): 44 | sql.append(null(table, column)) 45 | for column, cast in sorted(task.get('convert', {}).items()): 46 | sql.append(update_column(table, column, cast)) 47 | 48 | with open('update_schema.sql', 'w') as f: 49 | f.writelines(sql) 50 | -------------------------------------------------------------------------------- /update_schema.sql: -------------------------------------------------------------------------------- 1 | 2 | --============ SOCRBASE ============-- 3 | 4 | -- cast column socrbase.level to int 5 | BEGIN; 6 | alter table socrbase rename column level to level_x; 7 | alter table socrbase add column level int; 8 | update socrbase set level = level_x::int; 9 | alter table socrbase drop column level_x; 10 | COMMIT; 11 | 12 | --============ ADDROBJ ============-- 13 | 14 | --- update empty values for addrobj.nextid 15 | UPDATE addrobj SET nextid = NULL WHERE nextid = ''; 16 | 17 | --- update empty values for addrobj.previd 18 | UPDATE addrobj SET previd = NULL WHERE previd = ''; 19 | 20 | --- update empty values for addrobj.terrifnsfl 21 | UPDATE addrobj SET terrifnsfl = NULL WHERE terrifnsfl = ''; 22 | 23 | --- update empty values for addrobj.terrifnsul 24 | UPDATE addrobj SET terrifnsul = NULL WHERE terrifnsul = ''; 25 | 26 | --- update empty values for addrobj.ifnsfl 27 | UPDATE addrobj SET ifnsfl = NULL WHERE ifnsfl = ''; 28 | 29 | --- update empty values for addrobj.ifnsul 30 | UPDATE addrobj SET ifnsul = NULL WHERE ifnsul = ''; 31 | 32 | --- update empty values for addrobj.normdoc 33 | UPDATE addrobj SET normdoc = NULL WHERE normdoc = ''; 34 | 35 | --- update empty values for addrobj.parentguid 36 | UPDATE addrobj SET parentguid = NULL WHERE parentguid = ''; 37 | 38 | --- update empty values for addrobj.okato 39 | UPDATE addrobj SET okato = NULL WHERE okato = ''; 40 | 41 | --- update empty values for addrobj.oktmo 42 | UPDATE addrobj SET oktmo = NULL WHERE oktmo = ''; 43 | 44 | --- update empty values for addrobj.enddate 45 | UPDATE addrobj SET enddate = NULL WHERE enddate = ''; 46 | 47 | --- update empty values for addrobj.startdate 48 | UPDATE addrobj SET startdate = NULL WHERE startdate = ''; 49 | 50 | --- update empty values for addrobj.postalcode 51 | UPDATE addrobj SET postalcode = NULL WHERE postalcode = ''; 52 | 53 | -- cast column addrobj.actstatus to int 54 | BEGIN; 55 | alter table addrobj rename column actstatus to actstatus_x; 56 | alter table addrobj add column actstatus int; 57 | update addrobj set actstatus = actstatus_x::int; 58 | alter table addrobj drop column actstatus_x; 59 | COMMIT; 60 | 61 | -- cast column addrobj.aoguid to uuid 62 | BEGIN; 63 | alter table addrobj rename column aoguid to aoguid_x; 64 | alter table addrobj add column aoguid uuid; 65 | update addrobj set aoguid = aoguid_x::uuid; 66 | alter table addrobj drop column aoguid_x; 67 | COMMIT; 68 | 69 | -- cast column addrobj.aoid to uuid 70 | BEGIN; 71 | alter table addrobj rename column aoid to aoid_x; 72 | alter table addrobj add column aoid uuid; 73 | update addrobj set aoid = aoid_x::uuid; 74 | alter table addrobj drop column aoid_x; 75 | COMMIT; 76 | 77 | -- cast column addrobj.aolevel to int 78 | BEGIN; 79 | alter table addrobj rename column aolevel to aolevel_x; 80 | alter table addrobj add column aolevel int; 81 | update addrobj set aolevel = aolevel_x::int; 82 | alter table addrobj drop column aolevel_x; 83 | COMMIT; 84 | 85 | -- cast column addrobj.centstatus to int 86 | BEGIN; 87 | alter table addrobj rename column centstatus to centstatus_x; 88 | alter table addrobj add column centstatus int; 89 | update addrobj set centstatus = centstatus_x::int; 90 | alter table addrobj drop column centstatus_x; 91 | COMMIT; 92 | 93 | -- cast column addrobj.currstatus to int 94 | BEGIN; 95 | alter table addrobj rename column currstatus to currstatus_x; 96 | alter table addrobj add column currstatus int; 97 | update addrobj set currstatus = currstatus_x::int; 98 | alter table addrobj drop column currstatus_x; 99 | COMMIT; 100 | 101 | -- cast column addrobj.livestatus to int 102 | BEGIN; 103 | alter table addrobj rename column livestatus to livestatus_x; 104 | alter table addrobj add column livestatus int; 105 | update addrobj set livestatus = livestatus_x::int; 106 | alter table addrobj drop column livestatus_x; 107 | COMMIT; 108 | 109 | -- cast column addrobj.nextid to uuid 110 | BEGIN; 111 | alter table addrobj rename column nextid to nextid_x; 112 | alter table addrobj add column nextid uuid; 113 | update addrobj set nextid = nextid_x::uuid; 114 | alter table addrobj drop column nextid_x; 115 | COMMIT; 116 | 117 | -- cast column addrobj.normdoc to uuid 118 | BEGIN; 119 | alter table addrobj rename column normdoc to normdoc_x; 120 | alter table addrobj add column normdoc uuid; 121 | update addrobj set normdoc = normdoc_x::uuid; 122 | alter table addrobj drop column normdoc_x; 123 | COMMIT; 124 | 125 | -- cast column addrobj.operstatus to int 126 | BEGIN; 127 | alter table addrobj rename column operstatus to operstatus_x; 128 | alter table addrobj add column operstatus int; 129 | update addrobj set operstatus = operstatus_x::int; 130 | alter table addrobj drop column operstatus_x; 131 | COMMIT; 132 | 133 | -- cast column addrobj.parentguid to uuid 134 | BEGIN; 135 | alter table addrobj rename column parentguid to parentguid_x; 136 | alter table addrobj add column parentguid uuid; 137 | update addrobj set parentguid = parentguid_x::uuid; 138 | alter table addrobj drop column parentguid_x; 139 | COMMIT; 140 | 141 | -- cast column addrobj.previd to uuid 142 | BEGIN; 143 | alter table addrobj rename column previd to previd_x; 144 | alter table addrobj add column previd uuid; 145 | update addrobj set previd = previd_x::uuid; 146 | alter table addrobj drop column previd_x; 147 | COMMIT; 148 | --------------------------------------------------------------------------------