如何将Amazon Redshift连接到Python

17

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

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

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

以下是错误信息:

操作错误:无法将主机名"redshift://redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com,"翻译成地址:未知主机


更好的解决方案已经在以下链接中提供 - https://dev59.com/TaLia4cB1Zd3GeqPeSOm - Golokesh Patra
请在连接时包含您使用的模块名称。 - vt_todd
5个回答

44

看起来您想要在Python代码中运行Amazon Redshift查询。

您需要使用的参数是:

  • dbname:这是创建集群时在“数据库名称”字段中输入的数据库名称。
  • user:这是在创建集群时输入的“Master用户名称”字段。
  • password:这是在创建集群时输入的“Master用户密码”字段。
  • host:这是Redshift管理控制台中提供的端点(不包括结尾处的端口):redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com
  • port5439

例如:

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

你的主机名和我的主机名不同。这只是DNS名称,没有额外的东西。你的数据库名也不同。它应该只是在创建集群时输入的名称。 - John Rotenstein
是的,我知道,但我的主机名是正确的,我对此非常确定,尽管它仍然给我错误。 - vihaa_vrutti
1
主机应设置为可以通过DNS解析的名称。以“redshift://”开头的主机名是无效的。您的数据库名称也是无效的。 - John Rotenstein
2
啊!是逗号的问题。我的示例有误。请参阅psycopg2模块内容,有两种格式--一种是长字符串没有逗号,另一种是逗号分隔的单独参数。因此,请从您的字符串中删除逗号并查看发生了什么。 - John Rotenstein
感谢您的帮助,先生。 - vihaa_vrutti
显示剩余15条评论

2

虽然这是一个老问题,但我刚从谷歌过来。

接受的答案在使用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。希望这能帮助其他人!

0

连接到Redshift,需要使用postgres+psycopg2。安装方法如下:

对于 Python 3.x:

pip3 install psycopg2-binary

之后即可使用。

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

-2

对于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

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()
######################################

-3

从Python查询AWS Redshift最简单的方法是通过这个Jupyter扩展程序 - Jupyter Redshift

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


很酷的想法。但现在宣传还为时过早。 - ramsey0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接