You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas read_sql_query连接Trino引擎时遇两类错误,求排查

问题分析与解决方法

错误原因拆解

  1. 使用text(sql)时的错误:'list' object has no attribute 'keys'
    SQLAlchemy的text()对象要求参数以字典形式传递(命名参数),但你传入的是元组(位置参数),导致参数解析逻辑报错。

  2. 直接传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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:06:25