Копирование из CSV в базу данных Postgres на Heroku

Я пытаюсь использовать скрипт Python, запущенный в приложении Heroku, для копирования данных из CSV-файла в базу данных Postgres (база данных прикреплена к указанному приложению Heroku). Проблема, с которой я сталкиваюсь, заключается в том, что Heroku не разрешает суперпользовательскому доступу к Postgres, и, таким образом, команда Postgres COPY FROM 'filename' не может быть выполнена моим сценарием. Я попытался использовать COPY FROM STDIN, но безрезультатно.

Есть ли проблема с кодом ниже? Или, возможно, другим способом, которым я могу выполнить задачу копирования из файла 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)

1 ответ

Просто получите URL-адрес SQL (postgres://...) из веб-интерфейса Heroku. Затем вы можете запустить скрипт локально и подключиться к Heroku Postgres. Вот так я решил проблему для своего дела.

Другие вопросы по тегам