【问题标题】:python unable to parse table name correctly in sql querypython无法在sql查询中正确解析表名
【发布时间】:2021-09-26 21:49:56
【问题描述】:

我是雪花的新手。我正在尝试使用 python 脚本获取我的数据库中所有表的 ddl 。

import snowflake.connector
import sys


# Gets the version
cnx = snowflake.connector.connect(
    user='username',
    password='password',
    account='account',
    database='db',
    schema='schema',
    warehouse='warehouse',
    role='role'
    )
cnx.cursor().execute("USE warehouse warehouseName") 
cnx.cursor().execute("USE database dbName")
cnx = cnx.cursor()

dbSchema='schema name'

sql_select_objects = "select TABLE_NAME,TABLE_SCHEMA,TABLE_TYPE from  INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA='" + dbSchema + "';"

print(sql_select_objects)

try:
    cnx.execute(sql_select_objects)
    print('Query ID=' + cnx.sfqid)

    rows = cnx.fetchall()
    print("rows count:", len(rows))
    for row in rows:
        #print(row[0])
        file = open(row[0] + ".sql","w")
        rw='"' + row[0] + '"'
        print(rw)
        sql_ddl_object = "SELECT GET_DDL('TABLE', '" + row[0] + "')"
        print(sql_ddl_object)
        cnx.execute(sql_ddl_object)
        print('SQL2 sfqid=' + cnx.sfqid)
        row_ddl_table = cnx.fetchall()
        #print(row_ddl_table[0][0])
        file.write(str(row_ddl_table[0][0]))
        file.write("\n")
    
finally:
    cnx.close()

当我执行上面的脚本时,我得到了错误:

snowflake.connector.errors.ProgrammingError: 002003 (02000): SQL 编译错误:

表“SNOWFLAKE_TEST”不存在或未经授权。

在 "SELECT GET_DDL('TABLE', '" + row[0] + "')" 行中,我相信 python 没有正确解析 row[0] 的值。你能告诉我错误在哪里吗?

【问题讨论】:

    标签: python python-3.x snowflake-cloud-data-platform snowflake-schema


    【解决方案1】:

    很可能问题不在于表名,而在于您在代码中使用的角色。该角色很可能无权访问数据库及其表,因此会看到错误消息。

    【讨论】:

    • TABLES 视图仅显示会话的当前角色已被授予访问权限的对象。仅供参考
    • 角色没有问题。我在连接本身中发挥作用,所以它不应该引起问题
    【解决方案2】:

    请同时使用架构和表名,因为您可能在不同的架构中拥有表 SNOWFLAKE_TEST:

    "SELECT GET_DDL('TABLE', '" + row[1] + "." + row[0] + "')"
    

    我也会用双引号将表名和模式名括起来,因为您的模式或表可能是使用区分大小写的名称创建的:

    "SELECT GET_DDL('TABLE', '\"" + row[1] + "\".\"" + row[0] + "\"')"
    

    【讨论】:

    • 感谢您的快速建议。我现在已将表名更改为完全限定名称,如“dbName”。“schemaName”。“tableName”。脚本有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2023-03-27
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多