python - 为什么数字参数绑定(bind)不适用于 Python 雪花连接器?

标签 python snowflake-cloud-data-platform

如果在句点 (.) 之前使用 numeric/qmark 参数,为什么当我尝试使用 numeric/qmark 参数绑定(bind)时会出现 SQL 编译错误?

环境

  • Python 3 (3.11)
  • Pandas ==1.3.5
  • 雪花连接器-python==2.7.9

脚本

我使用以下代码来执行我的查询。

    from dotenv import load_dotenv
    import snowflake.connector

    snowflake_user = os.getenv("USER")
    snowflake_password = os.getenv("PWD")
    database_name = os.getenv("DATABASE")
    grey_schema_name = os.getenv("SCHEMA")
    warehouse_name = os.getenv("WAREHOUSE")


    def get_data(sql_query: str, params: Tuple[str, str]=None) -> pd.DataFrame:
        """
        Get data from database as a DataFrame
        :param sql_query:
        :return: pd.DataFrame
        """
        snowflake.connector.paramstyle='numeric'
        conn = snowflake.connector.connect(
            user=snowflake_user,
            password=snowflake_password,
            account=snowflake_account,
            database=database_name,
            schema=schema_name,
            warehouse=warehouse_name,
        )
        cur = conn.cursor()
        try:
            cur.execute(sql_query, params)
            all_rows = cur.fetchall()
            field_names = [i[0] for i in cur.description]
            cur.get_results_from_sfqid(cur.sfqid)
            task_logger.info(f"The following was the query executed:\n{cur.query}")
        finally:
            cur.close()
        conn.close()
        df = pd.DataFrame(all_rows)
        if len(df):
            df.columns = field_names
        return df

所以,我知道如何使用 numeric/qmark 绑定(bind)的基本知识。 换句话说,我们需要在 connect() 之前声明 snowflake.connector.paramstyle='numeric'。另外,execute 需要两个参数;一个是查询,其他数字/qmark 参数是字符串。

有了这个,如果我编写以下查询,我会收到 SQL 编译错误,例如 SQL 编译错误:语法错误第 1 行位于 X 位置意外的 ':'。 如果我写入database.:1.table

        query = (
            "SELECT * "
            "FROM :1.shema.table"
        )
        params = ('my_database')
        df = get_data(query, params)

相比之下,下面的就可以了。查询被发送到数据库,游标返回结果。

        query = (
            "SELECT :1 "
            "FROM database.shema.table"
        )
        params = ('*')
        df = get_data(query, params)

为什么我不能在句号前面使用 :N 表示法?

非常感谢!

最佳答案

为了参数化表名IDENTIFIER/TABLE必须使用:

query = (
        "SELECT * "
        "FROM IDENTIFIER(:1)"
)
params = ('my_database.schema.table')
df = get_data(query, params)

在这个特定场景中,schema.table 是常量,替代方案是在连接级别设置正确的数据库并使用两部分名称引用对象。

关于python - 为什么数字参数绑定(bind)不适用于 Python 雪花连接器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77202435/

相关文章:

python - 让 Enter 键的行为类似于 QTableWidget 中的 Tab

snowflake-cloud-data-platform - 雪花不接受连接中的别名

snowflake-cloud-data-platform - Snowflake 存储过程中的可选参数

sql - 雪花-sql : case when min vs first_value windows function

python - 忽略大小写删除重复记录

python - 在没有外部模块的情况下在 Python 中播放声音?

python - Pandas 合并箱

sql - .verify.JDBC.result(r, "Unable to retrieve JDBC result set",: Unable to retrieve JDBC result set JDBC ERROR: Numeric value 'NA' is not 中的错误

sql - REGEXP_REPLACE 雪花中以特定子字符串开头和结尾的字符串

python - 具有 2 个 Primary_keys 的 SQLAlchemy 表如何自动增量第一个主键