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

Posted

技术标签:

【中文标题】psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)【英文标题】:psycopg2/python copy data from postgresql to Amazon RedShift(postgresql) 【发布时间】:2015-05-06 08:28:26 【问题描述】:

我想了解社区对“使用 python 2.7.x 将数据从 PostgreSQL 复制到 RedShift 的最佳方式”的意见。我不能使用 Amazon S3,RedShift 是普通的 postgresql 数据库,但只支持从 S3 复制(我不能使用)

【问题讨论】:

... 你不能使用 S3 因为...? 我必须并行执行所有操作。不支持每次执行多个复制命令。无论如何,这主要是python知识问题。 Redshift docs 说他们支持 COPY “...来自 Amazon S3 上的文件、来自 DynamoDB 表或来自来自一个或多个远程主机的文本输出”所以您应该可以根据需要通过 python/psycopg2 加载 COPY 数据。 乔希,请看我之前的评论。从技术上讲这是可能的,但要求说 10 个并行操作比我使用复制是不可能的。 【参考方案1】:

您可以使用 Python/psycopg2/boto 对其进行端到端编码。 psycopg2 的替代方案是 PosgtreSQL 客户端 (psql.exe)。

如果您使用 psycopg2,您可以:

    从 PostgreSQL 假脱机到文件 上传到 S3 附加到 Redshift 表。

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

    将数据从 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
    

    上传到 S3。

    使用 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()
    

我已尽力将所有 3 个步骤编译成 one script。

【讨论】:

感谢您的回答,但您的脚本链接已损坏。可以转发一下吗?

以上是关于psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)的主要内容,如果未能解决你的问题,请参考以下文章

使用POST方法将数据从表单插入mysql

CodeIgniter 将 POST 数据从 RestClient 传递到 RestServer API

使用 POST、OKHttp 将数据从 SQLite 发送到 appServer

将数据从 POST Curl 插入 JAVA Spring

将 POST 数据从 Android 应用程序发送到 PHP MySQL

使用 post 方法将数据从 java android 发送到网络服务器