尝试使用 psycopg2.sql 在 python 中创建 Redshift 表
Posted
技术标签:
【中文标题】尝试使用 psycopg2.sql 在 python 中创建 Redshift 表【英文标题】:Trying to create Redshift table in python using psycopg2.sql 【发布时间】:2019-09-16 23:36:08 【问题描述】:我正在尝试使用 psycopg2 通过 python 在 redshift 中创建此表:
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);"
Schema.tablename 要通过命令行输入,所以我需要一个变量来保存 sys.arg[0]...但是如何使用 OR 我应该使用 psycopg2.sql 来构造它??
【问题讨论】:
【参考方案1】:如果我理解正确,您想在命令行上运行您的 python 脚本并传递几个参数,其中包括 Redshift 表的架构和表名。
您可以使用argparse
库将命令行参数解析为变量,然后将它们连接成sql字符串:
import argparse
...
# ---------------------------------------------------------------------------------#
# Parse arguments
# ---------------------------------------------------------------------------------#
parser = argparse.ArgumentParser()
parser.add_argument("schema")
parser.add_argument("table")
args = parser.parse_args()
schema_name = args.schema
table_name = args.table
...
sql = "CREATE TABLE if not exists " + schema_name + "." + table_name + " " +\
"( 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);"
...
你可以像这样在命令行调用你的脚本:
python my_script.py myschema mytable
【讨论】:
以上方法有效,但不会生成新表。就像提交不生效一样。我正在尝试将其分解...在使用命令行参数之前,我正在尝试在 redshift 中创建此表,但我所做的一切似乎都不起作用 “它有效”是什么意思?如果您发布其余代码,也许有人可以提供帮助? 请参阅代码:***.com/questions/57929991/… 该代码没有解释您所说的“它有效”是什么意思。你的意思是代码完成没有任何错误?您是否尝试过围绕生成的sql
值添加打印语句,然后在 Redshift 上手动运行该命令?这行得通吗?
它工作意味着它运行并且不返回错误但不创建任何表,是的,我已经做到了,将 sql 语句设为一行,使用 f-string 格式等等。因此,对我有帮助的是查看使用 psycopg2 或 psycopg2.sql 模型在 redshift 中创建具有 5 列的表的其他人的代码。以上是关于尝试使用 psycopg2.sql 在 python 中创建 Redshift 表的主要内容,如果未能解决你的问题,请参考以下文章