SQL编译错误--使用python进行Snowsql验证

Posted

技术标签:

【中文标题】SQL编译错误--使用python进行Snowsql验证【英文标题】:SQL compilation error-- Snowsql validation using python 【发布时间】:2020-07-23 16:03:55 【问题描述】:

我正在关注本教程:https://docs.snowflake.com/en/sql-reference/functions/validate.html

尝试“通过查询 ID 返回错误并将结果保存到表中以供将来参考”

但是,为了实现无缝传输,我不想总是输入作业 ID,因为它需要我转到雪花控制台 - 转到历史记录 - 获取作业 ID - 复制并将其粘贴到 python 代码中。

相反,我只想使用作为变量的表名和“last_query_id()”并给我列表错误。有什么办法可以实现吗?

import snowflake.connector
tableName='F58155'

ctx = snowflake.connector.connect(
user='*',
password='*',
account='*')

cs = ctx.cursor()

ctx.cursor().execute("USE DATABASE STORE_PROFILE_LANDING")
ctx.cursor().execute("USE SCHEMA PUBLIC")

try:
    ctx.cursor().execute("PUT file:///temp/data/tableName/* @% 
        tableName".format(tableName=tableName))
except Exception:
pass

ctx.cursor().execute("truncate table tableName".format(tableName=tableName))

ctx.cursor().execute("COPY INTO tableName ON_ERROR = 'CONTINUE'  ".format(tableName=tableName, 
FIELD_OPTIONALLY_ENCLOSED_BY = '""', sometimes=',', ERROR_ON_COLUMN_COUNT_MISMATCH = 'TRUE'))

我已经尝试了下面的验证功能....它在这一行上给了我错误

错误是“SQL 编译错误: 位置 74 处的语法错误第 1 行意外的“tableName”。 位置 83 处的第 1 行语法错误意外''。”

ctx.cursor().execute("create or replace table save_copy_errors as select * from 
table(validate(tableName,'select last_query_id()'))");


ctx.close()

【问题讨论】:

错误信息是什么? @demircioglu SQL 编译错误:位置 74 处的语法错误第 1 行意外'tableName'。第 1 行语法错误,位置 83 意外''。 您的 SQL 构造不正确。您要么需要.format(tableName=tableName) 来绑定变量,要么使用更易于阅读的 f 字符串表示法。所以它看起来像这样ctx.cursor().execute(f"create or replace table save_copy_errors as select * from table(validate(tableName,'select last_query_id()'))");。我也认为你需要job_id=>在tableName之后` @demircioglu 试过这个查询 --- ctx.cursor().execute(f"create or replace table save_copy_errors as select * from table(validate(tableName, job_id=> 'select last_query_id( );'))") 。它给了我一个错误——“表函数的参数无效[提供了无效的作业 UUID。]。表函数参数必须是一个常量。” 在这种情况下运行 sql 来获取作业 UUID 并将其传递给 validate sql 以获取 job_id job_id = ctx.cursor().execute("select last_query_id()").fetchone()[0] 你可以运行 validate sql 为 ctx.cursor().execute(f"create or replace table save_copy_errors as select * from table(validate(tableName,hob_id=>'job_id'))"); 【参考方案1】:

线

ctx.cursor().execute("create or replace table save_copy_errors as select * from 
table(validate(tableName,'select last_query_id()'))");

应该换成这两个

job_id = ctx.cursor().execute("select last_query_id()").fetchone()[0] 

ctx.cursor().execute(f"create or replace table save_copy_errors as select * from
table(validate(tableName,job_id=>'job_id'))");

【讨论】:

以上是关于SQL编译错误--使用python进行Snowsql验证的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:使用编译错误创建的函数 [关闭]

TSINGSEE青犀视频编译行人识别系统写入sql(python)语句实现流程

查看package编译时的错误信息及重新编译

OSError:隧道连接失败:需要 407 代理授权 - snowsql

python / cython编译pyx:致命错误:capsule.h:没有这样的文件或目录

使用 TRIGGER sql 发送电子邮件的编译错误