使用pandas read_sql_query连接Trino引擎时遇两类错误,求排查
问题分析与解决方法
错误原因拆解
使用
text(sql)时的错误:'list' object has no attribute 'keys'
SQLAlchemy的text()对象要求参数以字典形式传递(命名参数),但你传入的是元组(位置参数),导致参数解析逻辑报错。直接传
sql时的语法错误:mismatched input '='
Trino的SQLAlchemy方言不支持%s作为参数占位符,原SQL中的%s被当作语句的一部分保留,导致语法解析失败。
正确实现方式
方式一:使用SQLAlchemy命名参数(推荐)
from sqlalchemy import create_engine, text import pandas as pd # 正确创建SQLAlchemy连接引擎 con = create_engine('trino://rakesh%40xyz.com:***@anc.xyc.com:***/ktm/public') # 用命名占位符编写SQL语句 sql = text('SELECT * FROM glue.views.tbl_abc WHERE col_1 = :col1 AND col_2 = :col2') # 参数以字典形式传递,键对应SQL中的命名占位符 params = {'col1': '6017cef554df4124274ef36d', 'col2': '62ea18d1d931811975150c4b'} try: df = pd.read_sql_query(sql, con=con, params=params) except Exception as e: print(e)
方式二:适配Trino的位置占位符
Trino的SQLAlchemy方言支持?作为位置占位符,可直接配合元组参数使用:
import pandas as pd from sqlalchemy import create_engine con = create_engine('trino://rakesh%40xyz.com:***@anc.xyc.com:***/ktm/public') # 用?作为位置占位符 sql = 'SELECT * FROM glue.views.tbl_abc WHERE col_1 = ? AND col_2 = ?' params = ('6017cef554df4124274ef36d', '62ea18d1d931811975150c4b') try: df = pd.read_sql_query(sql, con=con, params=params) except Exception as e: print(e)
关键注意点
- 不要混用
text()和元组参数:text()仅支持字典形式的命名参数;直接传SQL字符串时,需用Trino兼容的?占位符配合元组。 - 修正引擎创建方式:原代码中
con = Engine(...)写法错误,需使用SQLAlchemy的create_engine()方法创建连接引擎。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

