如果在句点 (.) 之前使用 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/