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

Using Python to upload large csv files to Postgres RDS in AWS

使用 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 解释了为什么这不起作用。

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

首先,您需要像往常一样使用 CREATE TABLE SQL 语句在 RDS Postgres 中创建 table 定义。

然后你需要运行一个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()