【发布时间】: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”。