【问题标题】:Redshift create table not working via PythonRedshift 创建表无法通过 Python 工作
【发布时间】:2018-06-22 06:38:00
【问题描述】:

根据Unload to S3 with Python using IAM Role credentials,卸载语句运行良好。我尝试过的其他命令也是如此,例如复制和选择语句。

但是,我也尝试运行一个创建表的查询。创建表查询运行没有错误,但是当它到达 select 语句时,它会抛出 relation "public.test" does not exist 的错误。

知道为什么没有正确创建表吗?如下查询:

import sqlalchemy as sa
from sqlalchemy.orm import sessionmaker
import config
import pandas as pd

#>>>>>>>> MAKE CHANGES HERE >>>>>>>>
DATABASE = "db"
USER = "user"
PASSWORD = getattr(config, 'password') #see answer by David Bern https://stackoverflow.com/questions/43136925/create-a-config-file-to-hold-values-like-username-password-url-in-python-behave/43137301
HOST = "host"
PORT = "5439"
SCHEMA = "public"      #default is "public"

########## connection and session creation ##########
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(connection_string)
session = sessionmaker()
session.configure(bind=engine)
s = session()
SetPath = "SET search_path TO %s" % SCHEMA
s.execute(SetPath)

--create table example
query2 = '''\ 
create table public.test (
id integer encode lzo,
user_id integer encode lzo,
created_at timestamp encode delta32k,
updated_at timestamp encode delta32k
)
distkey(id)
sortkey(id)
'''

r2 = s.execute(query2)

--select example
query4 = '''\ 
select * from public.test
'''

r4 = s.execute(query4)

########## create DataFrame from SQL query output ##########
df = pd.read_sql_query(query4, connection_string)

print(df.head(50))

########## close session in the end ##########
s.close()

如果我直接在 Redshift 中运行相同的程序,它就可以正常工作..

--编辑--

尝试过的一些事情:

  • 从查询字符串中删除“\”

  • 添加“;”在查询字符串的末尾

  • 将“public.test”更改为“test”

  • 正在删除 SetPath = "SET search_path TO %s" % SCHEMA 和 s.execute(SetPath)

  • 破坏 create 语句 - 生成预期错误

  • 在创建后从 S3 命令添加副本 - 运行没有错误,但再次没有创建表

  • 添加一列以创建从复制命令生成的文件中不存在的语句 - 生成预期错误

  • 添加 r4 = s.execute(query4)- 运行没有错误,但再次创建的表不在 Redshift 中

【问题讨论】:

  • 从您的查询字符串中删除“\”字符。多行字符串以三引号或三单引号开头和结尾。我认为反斜杠字符正在破坏您的查询。但是,如果这是真的,您应该会收到错误消息。当您查看 Redshift 时,您是否看到任何新表?
  • @JohnHanley “\”字符允许我卸载/创建/选择,所以不应该是这样,但在删除它之后仍然是同样的问题。不,表不是从上面的脚本创建的。但是直接在 redshift 中运行 create 语句确实会创建表
  • 尝试将“public.test”更改为“test”或注释掉设置架构的两行:SetPath = "SET search_path TO %s" % SCHEMA s.execute(SetPath)
  • @JohnHanley 都试过了——不行。如果你在你的最后运行相同的,它会工作吗?
  • 故意破坏 CREATE Table sql 语句并验证您是否收到错误消息。示例将“CREATE”更改为 XXCREATE”。

标签: python amazon-redshift


【解决方案1】:

显然需要添加 s.commit() 才能创建表。如果您是通过复制命令或插入来填充它:然后在复制命令之后添加它(在创建表之后是可选的)。基本上,它不会自动提交创建/更改命令!

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-faq-whentocreate http://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit

【讨论】:

  • 感谢您发布解决方案。我不敢相信我忽略了提交部分。我的代码总是包含提交,我只是没有注意到它在代码中丢失。
猜你喜欢
  • 2017-12-14
  • 2021-07-07
  • 2019-01-13
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多