¿Cómo conectarse a un clúster en Amazon Redshift utilizando SQLAlchemy?

En la Guía de introducción de Amazon Redshift, se menciona que puede utilizar herramientas de cliente SQL compatibles con PostgreSQL para conectarse a su clúster de Amazon Redshift.

En el tutorial, utilizan SQL Workbench / J client, pero me gustaría utilizar python (en particular SQLAlchemy). He encontrado una pregunta relacionada , pero el problema es que no entra en los detalles ni en la secuencia de comandos de python que se conecta al Redshift Cluster.

He podido conectarme al clúster a través de SQL Workbench / J, ya que tengo la URL de JDBC, así como mi nombre de usuario y contraseña, pero no estoy seguro de cómo conectarme con SQLAlchemy.

Basado en esta documentación , he intentado lo siguiente:

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

ERROR:

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

No creo que la Alquimia SQL “de forma nativa” sepa acerca de Redshift. Debe cambiar la cadena de “URL” de JDBC para usar postgres .

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

Alternativamente, puede intentar usar sqlalchemy-redshift usando las instrucciones que proporcionan.

Me estaba topando con el mismo problema, y ​​luego recordé incluir mis credenciales de Redshift:

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

sqlalchemy-redshift funciona para mí, pero después de unos días de paquetes de investigación (python3.4):

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

En primer lugar, verifiqué que mi consulta funciona workbench ( http://www.sql-workbench.net ), luego lo obligo a trabajar en sqlalchemy (esto https://stackoverflow.com/a/33438115/2837890 ayuda para saber que auto_commit o session.commit () debe ser):

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

Y después de eso, me obligué a trabajar sqlalchemy_redshift CopyCommand, quizás de mala manera, parece poco complicado:

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

Hacemos justo lo que hice con sqlalchemy, excutar consulta, excepto consulta comine por CopyCommand. No he visto ningún beneficio :(.