Более или менее эта функция является частью утилиты, которую мы используем для технических специалистов нашей службы поддержки, и предназначена для предоставления им простого способа извлечения таблицы из резервной копии postgres, переименования таблицы и повторной вставки ее в другую базу данных. Моя функция отлично работает до фактической вставки таблицы в выбранную базу данных с помощью cur.execute(). Части sed (да, я хочу придерживаться sed) и извлечения отлично работают. Я хотел бы каким-то образом выполнить файл с помощью psycopg2, но я открыт для других предложений, если у кого-то есть идея, которая, возможно, использует подпроцесс и psql. Эта функция вызывается со списком имен таблиц, целевой базой данных и резервной копией файла sql. Я видел другие примеры использования .read(). Я также знаю, что должен преобразовать имя файла в переменную, чтобы немного очистить код. Если возможно, он также должен работать с Python 2.6.
for tbl in selected_tables:
# Open a file each iteration, dump the table in to it. Use .wait() to make sure the command finishes.
table_file = open(str(tbl) + backup_suffix + ".sql", "w")
p1 = subprocess.Popen(["/usr/bin/pg_restore", backup_picked, "-t", tbl], stdout=table_file)
p1.wait()
# Rename every instance of the table in the restore file. Format: _backup_YYYYMMDD
sed_guts = "s/" + str(tbl) + "/" + str(tbl) + backup_suffix + "/g"
p2 = subprocess.Popen(["/bin/sed", "-i", sed_guts, str(tbl) + backup_suffix + ".sql"])
p2.wait()
table_file.close()
# Restore the tables.
try:
# Gets the proper connection information. Works fine.
site_config = site.ParseConfig(target_site)
contents = open(str(tbl) + backup_suffix + ".sql", "r")
con = psycopg2.connect(user=site_config['dbusername'],host=site_config['host'], \
password= site_config['password'], port=site_config['port'],\
dbname=site_config['dbname'])
con.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
# Connect to postgres or to the db and then execute the query.
cur = con.cursor()
# Fails here
cur.execute(contents.read())
os.remove(str(tbl) + backup_suffix + ".sql")
except:
os.remove(str(tbl) + backup_suffix + ".sql")