2015-04-21 4 views
1

Я пытаюсь использовать скрипт 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) 
+0

Вы всегда можете разобрать файл и запустить инструкции insert. Это будет медленным, но если производительность не является критичной ... –

+0

@ Ник это подход, который я решил пойти, и он работает, но я беспокоюсь о производительности, поскольку db растет большими – travace

ответ

0

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

+0

Выполняет ли сценарий локальное обход проблема разрешения, если вы все еще используете Heroku Postgres? Кроме того, вы запускаете свой скрипт автоматически через планировщик, например, cron или каким-либо другим способом? – travace

Смежные вопросы