如何使用 SQLAlchemy 连接到 Amazon Redshift 中的集群?[英] How to connect to a cluster in Amazon Redshift using SQLAlchemy?

本文是小编为大家收集整理的关于如何使用 SQLAlchemy 连接到 Amazon Redshift 中的集群?的处理方法,想解了如何使用 SQLAlchemy 连接到 Amazon Redshift 中的集群?的问题怎么解决?如何使用 SQLAlchemy 连接到 Amazon Redshift 中的集群?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

在 Amazon Redshift 的 入门指南中,它提到您可以利用与 PostgreSQL 兼容的 SQL 客户端工具连接到您的 Amazon Redshift 集群.

在教程中,他们使用 SQL Workbench/J 客户端,但我想使用 python(特别是 SQLAlchemy).我发现了一个相关问题,但问题是它没有进入连接到 Redshift 集群的细节或 python 脚本.

我已经能够通过 SQL Workbench/J 连接到集群,因为我有 JDBC URL,以及我的用户名和密码,但我不确定如何连接到 SQLAlchemy.

基于此文档,我尝试了以下操作:

from sqlalchemy import create_engine
engine = create_engine('jdbc:redshift://shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy')

错误:

Could not parse rfc1738 URL from string 'jdbc:redshift://shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy'

推荐答案

我不认为 SQL Alchemy "原生地"了解 Redshift.您需要更改 JDBC"URL"字符串以使用 postgres.

jdbc:postgres://shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy

或者,您可能想按照他们提供的说明尝试使用 sqlalchemy-redshift.

其他推荐答案

我遇到了完全相同的问题,然后我记得包括我的 Redshift 凭据:

eng = create_engine('postgresql://[LOGIN]:[PASSWORD]@shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy')

其他推荐答案

sqlalchemy-redshift 对我有用,但是经过几天的研究包(python3.4):

<块引用>

SQLAlchemy==1.0.14 sqlalchemy-redshift==0.5.0 psycopg2==2.6.2

首先,我检查了我的查询是否在工作台工作(http://www.sql-workbench.net),然后我强制它在 sqlalchemy 中工作(这个 https://stackoverflow.com/a/33438115/2837890 有助于了解 auto_commit 或 session.commit() 必须是):

db_credentials = (
'redshift+psycopg2://{p[redshift_user]}:{p[redshift_password]}@{p[redshift_host]}:{p[redshift_port]}/{p[redshift_database]}'
    .format(p=config['Amazon_Redshift_parameters']))
engine = create_engine(db_credentials, connect_args={'sslmode': 'prefer'})
connection = engine.connect()
result = connection.execute(text(
    "COPY assets FROM 's3://xx/xx/hello.csv' WITH CREDENTIALS "
    "'aws_access_key_id=xxx_id;aws_secret_access_key=xxx'"
    " FORMAT csv DELIMITER ',' IGNOREHEADER 1 ENCODING UTF8;").execution_options(autocommit=True))
result = connection.execute("select * from assets;")
print(result, type(result))
print(result.rowcount)
connection.close()

在那之后,我被迫工作sqlalchemy_redshift CopyCommand 可能是不好的方式,看起来有点棘手:

import sqlalchemy as sa
tbl2 = sa.Table(TableAssets, sa.MetaData())
copy = dialect_rs.CopyCommand(
    assets,
    data_location='s3://xx/xx/hello.csv',
    access_key_id=access_key_id,
    secret_access_key=secret_access_key,
    truncate_columns=True,
    delimiter=',',
    format='CSV',
    ignore_header=1,
    # empty_as_null=True,
    # blanks_as_null=True,
)

print(str(copy.compile(dialect=RedshiftDialect(), compile_kwargs={'literal_binds': True})))
print(dir(copy))
connection = engine.connect()
connection.execute(copy.execution_options(autocommit=True))
connection.close()

我们做的只是我用 sqlalchemy 做的,执行查询,除了通过 CopyCommand 的 comine 查询.我没有看到一些利润:(.

本文地址:https://www.itbaoku.cn/post/1763854.html