尝试使用 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 表的主要内容,如果未能解决你的问题,请参考以下文章

python3 psycopg SQL 标识符必须是字符串

Python如何将RGB图像转换为Pytho灰度图像?

pytho爬虫之requests的使用

pytho 玩转Mysql

4.pytho while 循环

pytho lambda表达式