psycopg2 / python将数据从postgresql复制到Amazon RedShift(postgresql)

时间:2021-08-20 23:05:45

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,您可以:

  1. Spool to a file from PostgreSQL
  2. 从PostgreSQL传递到文件

  3. Upload to S3
  4. 上传到S3

  5. Append to Redshift table.
  6. 附加到Redshift表。

If you use psql.exe you can:

如果您使用psql.exe,您可以:

  1. 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
    
  2. Upload to S3.

    上传到S3。

  3. 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,您可以:

  1. Spool to a file from PostgreSQL
  2. 从PostgreSQL传递到文件

  3. Upload to S3
  4. 上传到S3

  5. Append to Redshift table.
  6. 附加到Redshift表。

If you use psql.exe you can:

如果您使用psql.exe,您可以:

  1. 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
    
  2. Upload to S3.

    上传到S3。

  3. 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个步骤编译成一个脚本。