如何将 Amazon Redshift 连接到 python
How to connect Amazon Redshift to python
这是我的 python 代码,我想将我的 Amazon Redshift 数据库连接到 Python,但它在主机中显示错误。
谁能告诉我正确的语法?我是否正确传递了所有参数?
con=psycopg2.connect("dbname = pg_table_def, host=redshifttest-icp.cooqucvshoum.us-west-2.redshift.amazonaws.com, port= 5439, user=me, password= secret")
这是错误:
OperationalError: could not translate host name "redshift://redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com," to address: Unknown host
您似乎希望 运行 来自 Python 代码的 Amazon Redshift 查询。
您要使用的参数是:
- dbname:这是您在创建集群时在
Database name
字段中输入的数据库名称。
- user: 这是您在创建集群时在
Master user name
字段中输入的。
- 密码:这是您在创建集群时在
Master user password
字段中输入的。
- host: 这是Redshift管理控制台中提供的Endpoint(末尾没有端口):
redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com
- 端口:
5439
例如:
con=psycopg2.connect("dbname=sales host=redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com port=5439 user=master password=secret")
从 python 查询 AWS Redshift 的最简单方法是通过此 Jupyter 扩展 - Jupyter Redshift
您不仅可以查询和保存结果,还可以从笔记本环境中将结果写回数据库。
好吧,对于 Redshift,这个想法是从 S3 复制,比任何其他方式都快,但这里有一些例子:
首先你必须安装一些依赖项
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()
######################################
老问题,但我刚从 Google 到这里。
已接受的答案不适用于 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 is based on PostgreSQL.
希望对其他人有所帮助!
这是我的 python 代码,我想将我的 Amazon Redshift 数据库连接到 Python,但它在主机中显示错误。
谁能告诉我正确的语法?我是否正确传递了所有参数?
con=psycopg2.connect("dbname = pg_table_def, host=redshifttest-icp.cooqucvshoum.us-west-2.redshift.amazonaws.com, port= 5439, user=me, password= secret")
这是错误:
OperationalError: could not translate host name "redshift://redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com," to address: Unknown host
您似乎希望 运行 来自 Python 代码的 Amazon Redshift 查询。
您要使用的参数是:
- dbname:这是您在创建集群时在
Database name
字段中输入的数据库名称。 - user: 这是您在创建集群时在
Master user name
字段中输入的。 - 密码:这是您在创建集群时在
Master user password
字段中输入的。 - host: 这是Redshift管理控制台中提供的Endpoint(末尾没有端口):
redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com
- 端口:
5439
例如:
con=psycopg2.connect("dbname=sales host=redshifttest-xyz.cooqucvshoum.us-west-2.redshift.amazonaws.com port=5439 user=master password=secret")
从 python 查询 AWS Redshift 的最简单方法是通过此 Jupyter 扩展 - Jupyter Redshift
您不仅可以查询和保存结果,还可以从笔记本环境中将结果写回数据库。
好吧,对于 Redshift,这个想法是从 S3 复制,比任何其他方式都快,但这里有一些例子:
首先你必须安装一些依赖项
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()
######################################
老问题,但我刚从 Google 到这里。
已接受的答案不适用于 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 is based on PostgreSQL.
希望对其他人有所帮助!