Amazon Redshiftの 入門ガイド では、PostgreSQLと互換性のあるSQLクライアントツールを利用してAmazonRedshiftクラスターに接続できると記載されています。
チュートリアルでは、SQL Workbench/Jクライアントを利用していますが、python(特にSQLAlchemy)を利用したいと思います。 関連する質問 、ただし、問題は、Redshiftクラスターに接続する詳細またはpythonスクリプトに含まれないことです。
JDBC URLとユーザー名とパスワードを持っているので、SQL Workbench/Jを介してクラスターに接続できましたが、SQLAlchemyに接続する方法がわかりません。
これに基づいて documentation 、私は以下を試しました:
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'
SQLAlchemyがRedshiftについて「ネイティブに」知っているとは思いません。 postgres
を使用するには、JDBCの「URL」文字列を変更する必要があります。
jdbc:postgres://shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy
または、提供されている手順を使用して sqlalchemy-redshift
を使用してみることもできます。
まったく同じ問題が発生しましたが、Redshiftの認証情報を含めることを思い出しました。
eng = create_engine('postgres://[LOGIN]:[PWORD]@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/283789 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()
CopyCommandによるcomineクエリを除いて、sqlalchemyで作成したクエリを実行します。私はいくつかの利益を見ていません:(。
import sqlalchemy as db
engine = db.create_engine('postgres://username:password@url:5439/db_name')
これは私のために働いた
以下は、あらゆる種類のSQLのDatabricksで機能します
import sqlalchemy as SA
import psycopg2
Host = 'your_Host_url'
username = 'your_user'
password = 'your_passw'
port = 5439
url = "{d}+{driver}://{u}:{p}@{h}:{port}/{db}".\
format(d="redshift",
driver='psycopg2',
u=username,
p=password,
h=Host,
port=port,
db=db)
engine = SA.create_engine(url)
cnn = engine.connect()
strSQL = "your_SQL ..."
try:
cnn.execute(strSQL)
except:
raise