Создайте SQL с определением дампа представления - представление заказа, чтобы избежать проблемы зависимостей - PullRequest
1 голос
/ 30 апреля 2019

Мне нужно создать скрипт для удаления и повторного создания представлений базы данных PostgreSQL с порядком зависимостей

Я пробовал с этим кодом Python:

# Copyleft ....
import os,sys,shutil,re,glob, getopt
import datetime
#import ogr

#open PostGIS connection
import psycopg2

conn = psycopg2.connect(dbname='XXXXX', port=5432, user='XXXXX', password='XXXXXX', host='XXXXXXX')


# Open a cursor to perform database operations
curr = conn.cursor()

conn.autocommit = True


#create the log file
f1=open('./log_cambio_CRS.txt', 'w')


#create the backup SQL file
ora=datetime.datetime.now()
ora_file=ora.strftime("%Y%m%d_%H%M%S")
nomefile='{0}_backup_viste_SIT2017.sql'.format(ora_file)
f2=open(nomefile, 'w')





#select
sql: str = 'SELECT t.table_schema, t.table_name, t.view_definition, row_number() over() as rowid ' \
      'FROM information_schema.views t ' \
      'where table_schema not in (\'gdo\', \'information_schema\', \'pg_catalog\', \'cron\', \'public\') ' \
      'order by rowid desc;'

print(sql)
curr.execute(sql)

for result in curr:
    schema=result[0]
    table=result[1]
    definition=result[2]

    f2.write('CREATE OR REPLACE {0}.{1} AS\n {2}'.format(schema,table,definition))
    f2.write('\n\n-- **************************************************\n\n')

curr.close


# new query to drop views - the order need to be the reverse
curr = conn.cursor()
#select
sql: str = 'SELECT t.table_schema, t.table_name ' \
      'FROM information_schema.views t ' \
      'where table_schema not in (\'gdo\', \'information_schema\', \'pg_catalog\', \'cron\',\'public\');'

print(sql)
curr.execute(sql)

for result in curr:
    schema=result[0]
    table=result[1]
    drop_sql='DROP VIEW {0}.{1};'.format(schema,table);
    print(drop_sql)
    #curr.execute(drop_sql)

curr.close


curr = conn.cursor()

Проблема связана с запросом

SELECT t.table_schema, t.table_name, t.view_definition, row_number() over() as rowid   
FROM information_schema.views t 
where table_schema not in ('gdo', 'information_schema', 'pg_catalog', 'cron', 'public')
order by rowid desc;

Я не уверен, что порядок создания представлений правильный. Например, возможно, что первое представление SQL зависит от представления, которое еще не создано, поэтому SQL не будет работать!

1 Ответ

1 голос
/ 03 мая 2019

Я частично решил (только для БД без восстановления) и выложу ответ, для людей нужно одно и то же решение:

Решение заключается в использовании таблицы pg_class , которая содержит поле relfilenode .

Сценарий резервного копирования SQL создается, упорядочивая представления по следующему правилу:

order by relfilenode;

пока я опускаю представления, упорядочивая их противоположным образом:

order by relfilenode DESC;

Пример запроса, используемого для получения определений представлений, следующий:

SELECT t.table_schema, t.table_name, t.view_definition,
row_number() over() as rowid , p.relfilenode 
FROM information_schema.views t, pg_class p 
where table_schema not in ('gdo', 'information_schema', 'pg_catalog', 'cron', 'public') 
and p.relname=t.table_name
order by p.relfilenode;

Я надеюсь, что это может быть полезно, но нам нужно лучшее решение с использованием pg_depend и / или pg_history

Есть примеры?

...