繁体   English   中英

如何将 Amazon Redshift 连接到 python

[英]How to connect Amazon Redshift to python

这是我的 python 代码,我想将我的 Amazon Redshift 数据库连接到 Python,但它在主机中显示错误。

谁能告诉我正确的语法? 我是否正确传递了所有参数?

con=psycopg2.connect("dbname = pg_table_def, host=redshifttest-icp.cooqucvshoum.us-west-2.redshift.amazonaws.com, port= 5439, user=me, password= secret")

这是错误:

OperationalError:无法将主机名“redshift://redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com”转换为地址:未知主机

您似乎希望从Python代码运行Amazon Redshift查询。

您要使用的参数是:

  • dbname :这是创建集群时在“ Database name字段中输入的Database name
  • 用户:创建集群时,您是在“ Master user name字段中输入的。
  • 密码:创建集群时,您是在“ Master user password字段中输入的。
  • 主机:这是Redshift管理控制台中提供的端点(末尾没有端口): redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com
  • 端口: 5439

例如:

con=psycopg2.connect("dbname=sales host=redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com port=5439 user=master password=secret")

老问题,但我刚从谷歌来到这里。

接受的答案不适用于 SQLAlchemy,尽管它由 psycopg2 提供支持:

sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string 'dbname=... host=... port=... user=... password=...'

什么有效:

create_engine(f"postgresql://{REDSHIFT_USER}:{REDSHIFT_PASSWORD}@{REDSHIFT_HOST}:{REDSHIFT_PORT}/{REDSHIFT_DATABASE}")

也可以直接与 psycopg2 一起使用:

psycopg2.connect(f"postgresql://{REDSHIFT_USER}:{REDSHIFT_PASSWORD}@{REDSHIFT_HOST}:{REDSHIFT_PORT}/{REDSHIFT_DATABASE}")

使用postgresql方言有效,因为Amazon Redshift 基于 PostgreSQL

希望它可以帮助其他人

要连接到 redshift,您需要postgres+psycopg2将其安装为 For Python 3.x:

pip3 安装 psycopg2-binary

然后使用

return create_engine(
        "postgresql+psycopg2://%s:%s@%s:%s/%s"
        % (REDSHIFT_USERNAME, urlquote(REDSHIFT_PASSWORD), REDSHIFT_HOST, RED_SHIFT_PORT,
           REDSHIFT_DB,)
    )

从python查询AWS Redshift的最简单方法是通过此Jupyter扩展-Jupyter Redshift

您不仅可以查询和保存结果,还可以将它们从笔记本环境中写回到数据库中。

好吧,对于Redshift,从S3制作COPY的想法比所有其他方式都快,但是这里有一些示例可以做到:

首先,您必须安装一些依赖项

对于linux用户sudo apt-get install libpq-dev

对于Mac用户brew install libpq

使用pip安装此依赖项pip3 install psycopg2-binary pip3 install sqlalchemy pip3 install sqlalchemy-redshift pip3 install sqlalchemy pip3 install sqlalchemy-redshift

import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker


#>>>>>>>> MAKE CHANGES HERE <<<<<<<<<<<<<
DATABASE = "dwtest"
USER = "youruser"
PASSWORD = "yourpassword"
HOST = "dwtest.awsexample.com"
PORT = "5439"
SCHEMA = "public"

S3_FULL_PATH = 's3://yourbucket/category_pipe.txt'
ARN_CREDENTIALS = 'arn:aws:iam::YOURARN:YOURROLE'
REGION = 'us-east-1'

############ CONNECTING AND CREATING SESSIONS ############
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = "SET search_path TO %s" % SCHEMA
s.execute(SetPath)
###########################################################



############ RUNNING COPY ############
copy_command = '''
copy category from '%s'
credentials 'aws_iam_role=%s'
delimiter '|' region '%s';
''' % (S3_FULL_PATH, ARN_CREDENTIALS, REGION)
s.execute(copy_command)
s.commit()
######################################



############ GETTING DATA ############
query = "SELECT * FROM category;"
rr = s.execute(query)
all_results =  rr.fetchall()

def pretty(all_results):
    for row in all_results :
        print("row start >>>>>>>>>>>>>>>>>>>>")
        for r in row :
            print(" ---- %s" % r)
        print("row end >>>>>>>>>>>>>>>>>>>>>>")

pretty(all_results)
s.close()
######################################

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM