【问题标题】:Trying to create a Redshift table using Python and psycopg2 but the table does not get created with no errors reported尝试使用 Python 和 psycopg2 创建 Redshift 表,但未创建表且未报告错误
【发布时间】: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


【解决方案1】:

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

coderedshift 没有问题。无论发生什么都在意料之中。

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

这是根据 Redshift documentation 预期的。它没有错。以下是if not exist 的文档摘录。

如果不存在

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

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

取出它,它会返回奇怪的重复错误。

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

我在 Redshift 中没有看到表格

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

希望对你有帮助。

【讨论】:

  • "IF NOT EXISTS 子句表示如果指定的表已经存在,命令应该不做任何更改并返回表存在的消息" 这就是我所期望的......表永远不会被创建。这正是我的问题。是的,我尝试插入数据,选择数据并进入控制台上的查询生成器,在那里也看不到它。我确实看到了其他表,所以我知道这不是权限错误。运行代码...你不会得到新表。我相信问题在于我的“sql”字符串,我了解到 psygopg2 有一种特定的方式来处理字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多