2017-10-27 23 views
0

Pythonを使用してAWSのPostgres RDSデータベースに大規模なcsvファイルをロードする最も簡単な方法は何ですか?地元のpostgresインスタンスにデータを転送するPythonを使用して大規模なcsvファイルをAWSのPostgres RDSにアップロード

が、私は以前のようなSQL文を実行するためにpsycopg2接続を使用しています。リモートAWS RDSデータベースに対してこれを実行する際に

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

をただし、これはエラーを生成します.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

'PSQL -c「\ MY_TABLE COPY

は、その後、あなたはこのようなpsqlステートメントを実行する必要がありますFROM 'my_10gb_file.csv' DELIMITER '、' CSV HEADER; "'は動作します... –

答えて

0

まず、CREATE TABLE SQL文を使用して、RDS Postgresでテーブル定義を作成する必要があります。

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() 
関連する問題