Я пытаюсь использовать скрипт python, запущенный в приложении Heroku, для копирования данных из CSV-файла в базу данных Postgres (база данных прикреплена к указанному приложению Heroku). Проблема, с которой я сталкиваюсь, заключается в том, что Heroku не разрешает доступ суперпользователя к Postgres, и поэтому COPY FROM 'filename' Команда Postgres не может быть запущена моим скриптом. Я пробовал использовать КОПИРОВАТЬ ОТ STDIN вместо этого, безрезультатно.Копирование из базы данных CSV в Postgres на Heroku
Есть проблемы с кодом ниже? Или, возможно, другим способом я могу выполнить задачу копирования из файла CSV в мою базу данных Heroku Postgres в моем сценарии? Ручное выполнение команд psql в терминале не является опцией, поскольку все дело в том, чтобы автоматизировать процесс копирования, чтобы обновлять мою базу данных без моего касания.
#copysql is a string with the command for copying from the CSV file; newvals is the name of a temporary table I will use for the data imported from the CSV file
copysql = """COPY newvals FROM STDIN (FORMAT csv, NULL 'NULL');"""
#sqlquery is the SQL string for inserting new data found in the temporary table which is created from the CSV import into the existing Postgres database
sqlquery = """INSERT INTO desttable SELECT newvals.id, newvals.column1, newvals.column2 FROM newvals LEFT OUTER JOIN desttable ON (desttable.id = newvals.id) WHERE desttable.id IS NULL;"""
#my CSV file is called 'csvfile' and cur is the database cursor (using psycopg2 and I have already connected to the db elsewhere in my script)
cur.execute("DROP TABLE IF EXISTS newvals;")
cur.execute("CREATE TEMPORARY TABLE newvals AS SELECT * FROM desttable LIMIT 0;")
cur.copy_expert(sql=copysql,file=csvfile)
cur.execute(sqlquery)
Вы всегда можете разобрать файл и запустить инструкции insert. Это будет медленным, но если производительность не является критичной ... –
@ Ник это подход, который я решил пойти, и он работает, но я беспокоюсь о производительности, поскольку db растет большими – travace