web-dev-qa-db-ja.com

SQLAlchemyを使用してAmazonRedshiftのクラスターに接続するにはどうすればよいですか?

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'
6
Chris

SQLAlchemyがRedshiftについて「ネイティブに」知っているとは思いません。 postgresを使用するには、JDBCの「URL」文字列を変更する必要があります。

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

または、提供されている手順を使用して sqlalchemy-redshift を使用してみることもできます。

5
Joe Harris

まったく同じ問題が発生しましたが、Redshiftの認証情報を含めることを思い出しました。

eng = create_engine('postgres://[LOGIN]:[PWORD]@shippy.cx6x1vnxlk55.us-west-2.redshift.amazonaws.com:5439/shippy
2
Jasper Croome

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で作成したクエリを実行します。私はいくつかの利益を見ていません:(。

1
Anshik
import sqlalchemy as db
engine = db.create_engine('postgres://username:password@url:5439/db_name')

これは私のために働いた

0
Achilleus

以下は、あらゆる種類の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
0
Jie