使用Python将大型csv文件上传到AWS中的Postgres RDS

时间:2017-10-27 07:14:05

标签: postgresql amazon-rds

使用Python将大型csv文件加载到AWS中的Postgres RDS数据库的最简单方法是什么?

要将数据传输到本地postgres实例,我之前使用psycopg2连接来运行SQL语句,如:

COPY my_table FROM 'my_10gb_file.csv' DELIMITER ',' CSV HEADER;

但是,在针对远程AWS RDS数据库执行此操作时,这会生成错误,因为.csv文件位于我的本地计算机而不是数据库服务器上:

ERROR: must be superuser to COPY to or from a file
SQL state: 42501
Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

This answer解释了为什么这不起作用。

我现在正在寻找使用psql自动执行此操作的Python语法。我需要上传大量.csv个文件,因此我需要一个脚本来自动执行此操作。

1 个答案:

答案 0 :(得分:1)

首先,您需要使用CREATE TABLE SQL语句在RDS Postgres中正常创建表定义。

然后你需要像这样运行psql语句:

psql -p 5432 --host YOUR_HOST --username YOUR_USERNAME --dbname YOUR_DBNAME --command "\copy my_table FROM 'my_10gb_file.csv' DELIMITER ',' CSV HEADER"

在Python中,我们可以设置它并按如下方式执行它:

host = "YOUR_HOST"
username = "YOUR_USERNAME"
dbname = "YOUR_DBNAME"

table_name = "my_table"
file_name = "my_10gb_file.csv"
command = "\copy {} FROM '{}' DELIMITER ',' CSV HEADER".format(table_name, file_name)

psql_template = 'psql -p 5432 --host {} --username {} --dbname {} --command "{}"'

bash_command = psql_template.format(host, username, dbname, command.strip())

process = subprocess.Popen(bash_command, stdout=subprocess.PIPE, shell=True) 

output, error = process.communicate()