Мне нужно создать скрипт для удаления и повторного создания представлений базы данных 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 не будет работать!