使用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
个文件,因此我需要一个脚本来自动执行此操作。
答案 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()