Копирование из 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)

person travace    schedule 21.04.2015    source источник
comment
Вы всегда можете проанализировать файл и запустить операторы вставки. Будет медленно, но если производительность не критична...   -  person Nick Bailey    schedule 21.04.2015
comment
@Ник, это подход, который я решил использовать, и он работает, но я беспокоюсь о производительности, поскольку БД становится большой.   -  person travace    schedule 22.04.2015


Ответы (1)


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

person Martin Krämer    schedule 21.04.2015
comment
Обходит ли локальный запуск сценария проблему с правами доступа, если вы все еще используете Heroku Postgres? Кроме того, вы запускаете свой скрипт автоматически через планировщик, такой как cron, или каким-либо другим способом? - person travace; 21.04.2015