【发布时间】:2020-01-15 16:56:02
【问题描述】:
我的代码没有返回错误,但我在 Redshift 中没有看到表...如果我输入“如果表存在”并尝试创建一个我知道存在的表,它什么也不做,也不返回任何错误。把它拿出来,它会返回奇怪的可重复错误。
import boto3
import psycopg2
import sys
#Assign global variables data needed to make connection to Redshift
DB_NAME = '<database>'
CLUSTER_IDENTIFIER = '<clusterName>'
DB_USER = '<user>'
ENDPOINT = '<clustername>.<randomkey>.us-east-1.redshift.amazonaws.com'
REGION = 'us-east-1'
sql = "CREATE TABLE if not exists " + "<schema>.<tablename> " + \
"( vendorid varchar(4), pickup_datetime TIMESTAMP, " + \
"dropoff_datetime TIMESTAMP, store_and_fwd_flag varchar(1), " + \
"ratecode int, pickup_longitude float(4), pickup_latitude float(4)," + \
"dropoff_logitude float(4), dropoff_latitude float(4), " + \
"passenger_count int, trip_distance float(40), fare_amount float(4), " + \
"extra float(4), mta_tax float(4), tip_amount float(4), " + \
"tolls_amount float(4), ehail_fee float(4), improvement_surcharge float(4), " + \
"total_amount float(4), payment_type varchar(4), trip_type varchar(4)) " + \
"DISTSTYLE EVEN SORTKEY (passenger_count, pickup_datetime);"
try:
#make redshift connection
client = boto3.client('redshift', region_name='us-east-1')
#get temporary username and password
cluster_creds = client.get_cluster_credentials(DbUser=DB_USER, DbName=DB_NAME, ClusterIdentifier=CLUSTER_IDENTIFIER, AutoCreate=False)
temp_user = cluster_creds['DbUser']
temp_pswd = cluster_creds['DbPassword']
#create connection string to database
conn = psycopg2.connect(f"host='{ENDPOINT}' port='5439' user={temp_user} password={temp_pswd} dbname='{DB_NAME}'")
#Attempt to create table
cursor = conn.cursor()
cursor.execute(sql)
conn.commit
cursor.close()
conn.close()
#report any errors
except Exception as ex:
print("Exception name : " + ex.__class__.__name__)
print(str(ex))
print("Failed to open connection to Redshift database")
sys.exit(1)
【问题讨论】:
-
您是否尝试过通过打印您的 sql 字符串进行调试,然后尝试使用已知良好的连接/ide 在 redshift 上直接运行它?
-
是的@JonScott 我打印了 e sql 字符串,它看起来正确但是我想知道 psycopg2 库是否没有正确读取它。也许我应该听 psycopg2.sql 进行字符串连接?
-
也许我不理解这个问题,但是如果您运行“CREATE TABLE IF NOT EXISTS”语句并且表已经存在,那么预期的行为是什么都不会改变并且没有错误,因为什么都没有出错。你期待发生什么?如果您取出“IF NOT EXISTS”,那么正如您所提到的,将生成一个错误,因为它试图创建一个已经存在的表,这又是预期的行为。你能澄清一下你想要做什么吗?
标签: python-3.x amazon-redshift boto3 psycopg2