I would like to know community opinion regarding the "best way to copy data from PostgreSQL to RedShift with python 2.7.x". I can't use Amazon S3 and RedShift is normal postgresql database but support copy only from S3(I can't use)
我想知道社区对“使用python 2.7.x将数据从PostgreSQL复制到RedShift的最佳方法”的意见。我不能使用Amazon S3和RedShift是普通的postgresql数据库,但只支持从S3复制(我不能使用)
1 个解决方案
#1
You can use Python/psycopg2/boto to code it end-to-end. Alternative to psycopg2 is PosgtreSQL client (psql.exe).
您可以使用Python / psycopg2 / boto对其进行端到端编码。 psycopg2的替代品是PosgtreSQL客户端(psql.exe)。
If you use psycopg2 you can:
如果您使用psycopg2,您可以:
- Spool to a file from PostgreSQL
- Upload to S3
- Append to Redshift table.
从PostgreSQL传递到文件
上传到S3
附加到Redshift表。
If you use psql.exe you can:
如果您使用psql.exe,您可以:
-
Pipe data to S3 multipart uploader from PostgreSQL
从PostgreSQL将数据传输到S3多部分上传器
in_qry=open(opt.pgres_query_file, "r").read().strip().strip(';') db_client_dbshell=r'%s\bin\psql.exe' % PGRES_CLIENT_HOME.strip('"') loadConf=[ db_client_dbshell ,'-U', opt.pgres_user,'-d',opt.pgres_db_name, '-h', opt.pgres_db_server] q=""" COPY ((%s) %s) TO STDOUT WITH DELIMITER ',' CSV %s """ % (in_qry, limit, quote) #print q p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env) p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE) p1.wait() return p2
-
Upload to S3.
上传到S3。
-
Append to Redshift table using psycopg2.
使用psycopg2附加到Redshift表。
fn='s3://%s' % location conn_string = REDSHIFT_CONNECT_STRING.strip().strip('"') con = psycopg2.connect(conn_string); cur = con.cursor(); quote='' if opt.red_quote: quote='quote \'%s\'' % opt.red_quote ignoreheader ='' if opt.red_ignoreheader: ignoreheader='IGNOREHEADER %s' % opt.red_ignoreheader timeformat='' if opt.red_timeformat: #timeformat=" dateformat 'auto' " timeformat=" TIMEFORMAT '%s'" % opt.red_timeformat.strip().strip("'") sql=""" COPY %s FROM '%s' CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' DELIMITER '%s' FORMAT CSV %s GZIP %s %s; COMMIT; """ % (opt.red_to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.red_col_delim,quote, timeformat, ignoreheader) cur.execute(sql) con.close()
I did my best compiling all 3 steps into one script.
我尽力将所有3个步骤编译成一个脚本。
#1
You can use Python/psycopg2/boto to code it end-to-end. Alternative to psycopg2 is PosgtreSQL client (psql.exe).
您可以使用Python / psycopg2 / boto对其进行端到端编码。 psycopg2的替代品是PosgtreSQL客户端(psql.exe)。
If you use psycopg2 you can:
如果您使用psycopg2,您可以:
- Spool to a file from PostgreSQL
- Upload to S3
- Append to Redshift table.
从PostgreSQL传递到文件
上传到S3
附加到Redshift表。
If you use psql.exe you can:
如果您使用psql.exe,您可以:
-
Pipe data to S3 multipart uploader from PostgreSQL
从PostgreSQL将数据传输到S3多部分上传器
in_qry=open(opt.pgres_query_file, "r").read().strip().strip(';') db_client_dbshell=r'%s\bin\psql.exe' % PGRES_CLIENT_HOME.strip('"') loadConf=[ db_client_dbshell ,'-U', opt.pgres_user,'-d',opt.pgres_db_name, '-h', opt.pgres_db_server] q=""" COPY ((%s) %s) TO STDOUT WITH DELIMITER ',' CSV %s """ % (in_qry, limit, quote) #print q p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env) p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE) p1.wait() return p2
-
Upload to S3.
上传到S3。
-
Append to Redshift table using psycopg2.
使用psycopg2附加到Redshift表。
fn='s3://%s' % location conn_string = REDSHIFT_CONNECT_STRING.strip().strip('"') con = psycopg2.connect(conn_string); cur = con.cursor(); quote='' if opt.red_quote: quote='quote \'%s\'' % opt.red_quote ignoreheader ='' if opt.red_ignoreheader: ignoreheader='IGNOREHEADER %s' % opt.red_ignoreheader timeformat='' if opt.red_timeformat: #timeformat=" dateformat 'auto' " timeformat=" TIMEFORMAT '%s'" % opt.red_timeformat.strip().strip("'") sql=""" COPY %s FROM '%s' CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' DELIMITER '%s' FORMAT CSV %s GZIP %s %s; COMMIT; """ % (opt.red_to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.red_col_delim,quote, timeformat, ignoreheader) cur.execute(sql) con.close()
I did my best compiling all 3 steps into one script.
我尽力将所有3个步骤编译成一个脚本。