Python和snowflake cursor正在添加额外的文本来更改表外键查询,从而导致无法找到表本身
我正在构建一个管道,将本地文件夹中的数据上传到雪花云 上传每个表后的最后一步是更改以CSV文件名命名的表本身,向主表添加外键。我正在做以下工作:Python和snowflake cursor正在添加额外的文本来更改表外键查询,从而导致无法找到表本身,python,foreign-keys,snowflake-cloud-data-platform,Python,Foreign Keys,Snowflake Cloud Data Platform,我正在构建一个管道,将本地文件夹中的数据上传到雪花云 上传每个表后的最后一步是更改以CSV文件名命名的表本身,向主表添加外键。我正在做以下工作: query = """ALTER TABLE """+filename+""" ADD FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS(SURVEY_ID)""" if(cursor.execut
query = """ALTER TABLE """+filename+""" ADD FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS(SURVEY_ID)"""
if(cursor.execute(query)):
print(filename+ " FOREIGN KEY added successfully")
else:
print(filename+" FOREIGN KEY was not added")
我有以下错误:
表“MY_DB.PUBLIC.SURVEY_AST”不存在或不存在
授权的
我知道表名应该与上面的一样,以便找到并执行查询:
“我的数据库”“公共”“调查”
如果我打印文件名
,我将得到:
调查
我尝试使用%s
,但无法使用雪花光标绑定表名本身:
query = """ALTER TABLE %s ADD FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS(SURVEY_ID)"""
if(cursor.execute(query, (filename)):
print(filename+ " FOREIGN KEY added successfully")
else:
print(filename+" FOREIGN KEY was not added")
如何使引擎停止将额外文本绑定到表本身,以便找到它并执行查询
请注意,前面的查询工作正常(插入、选择…)
编辑
conn = snowCtx.connect(
user=user,
password=password,
account=account,
database='MY_DB',
schema='PUBLIC',
warehouse='COMPUTE_WH',
role='SYSADMIN'
)
if(success):
print(filename+' columns uploaded')
# UPDATE now variable
now = date.today().strftime("%Y-%m-%d")
# To insert the data files into the new table
data = data.applymap(str)
data['_xform_id'] = data['_xform_id'].apply(lambda x: int(float(x)))
data['SURVEY_ID'] = data['SURVEY_ID'].apply(lambda x: int(str(x)))
try:
data.to_sql(name=filename,
con=engine.connect(),
if_exists="replace",
index=False)
print(filename+' to_sql() done.')
print("--- %s seconds ---" % (time.time() - start_time))
log_frame.append({'Survey Name': filename, 'Survey ID': nextval}, ignore_index=True)
except sqlalchemy.exc.Error as e:
print("Error adding the table: "+ e)
# Add a foreign key
finally:
# query = "select count (*) from information_schema.tables WHERE table_type = 'BASE TABLE' AND table_name="+filename
print(filename)
query = """ALTER TABLE {0} ADD FOREIGN KEY (SURVEY_ID) REFERENCES SURVEYS(SURVEY_ID)""".format(filename.replace('\'', '\'\''))
print(query)
if(cursor.execute(query)):
print(filename+ " FOREIGN KEY added successfully")
else:
print(filename+" FOREIGN KEY was not added")
我不认为它添加了任何额外的文本。如我所见,错误消息包括数据库和模式名称(这是预期的)。例如:
create table DENEME ( i integer );
alter table DENEME2 add column z varchar;
SQL compilation error: Table 'GOKHAN_DB.PUBLIC.DENEME2' does not exist or not authorized.
请检查查询历史记录以查看SQL文本:
您认为表名应该如下所示吗
“我的数据库”“公共”“调查”
它与MY_DB.PUBLIC.SURVEY_AST没有什么不同(因为所有字符都是大写的)。所以它应该会起作用。请检查前面的命令以了解如何创建表(可能是在不同的架构中创建的)。解决方案是对
文件名本身执行以下操作:
filename = "\""+database+"\".\""+schema+"\".\""+filename+"\""
结果恰恰是:
"MY_DB"."SCHEMA"."TABLENAME"
我不这么认为,因为我在snowflake上尝试了完全相同的查询:'MY\u DB.PUBLIC.SURVEY\u AST'
,收到了相同的错误我认为表正在添加,但没有完全设置,所以在执行脚本之前等待几秒钟应该可以让它工作吗?您可以共享整个脚本吗?您是否异步运行这些命令?您说过INSERT在您的表上工作,所以它不应该与未完全设置有关。当然,我将与您共享脚本。给我10分钟。脚本补充说,先生。希望你能帮我。