尝试使用 Python 和 psycopg2 创建 Redshift 表,但未创建该表且未报告错误



我的代码没有返回错误,但我在 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)

我的代码没有返回错误,但我在 Redshift 中看不到表格......如果我输入"如果表存在"并尝试创建一个我知道存在的表,它什么也不做,也不会返回任何错误。把它拿出来,它将返回可重复的错误,这很奇怪。

coderedshift没有问题.无论发生什么,都是意料之中的。

如果我输入"如果表存在"并尝试创建一个我知道存在的表,它什么也不做,也不返回任何错误

根据红移文档,这是预期的。没有错。以下是if not exist的文档摘录。

如果不存在

该子句指示如果指定的表已存在,则该命令不应进行任何更改并返回该表存在的消息,而不是以错误终止。请注意,现有表可能与将创建的表完全不同;仅使用表名进行比较。

此子句在编写脚本时很有用,因此如果 CREATE TABLE 尝试创建已存在的表,脚本不会失败。

把它拿出来,它将返回可重复的错误,这很奇怪。

它的预期,表已经存在,因此duplicate table error.

我在红移中看不到表

这应该是一个问题,即您用于查看表的用户无权查看该表或错误地查看其他数据库。 为了证明我的观点,表存在,请尝试使用您的程序在表中插入一些记录并尝试选择这些记录,如果发生这种情况,则证明表存在并具有数据。您可能用来查看表的其他用户可能无权查看该表。

我希望它有所帮助。

最新更新