使用Trino Python Client执行多条SQL语句报错,求解决方案
Trino Python Client执行多语句SQL时USE语句不生效导致查询报错
问题场景
使用Trino Python Client执行多条SQL语句,通过拆分分号的方式逐个执行:
queries = filter(None, query.split(";")) for singleQuery in queries: cursor.execute(singleQuery) rows = cursor.fetchall()
当执行SQL use test; select * from tbl时,触发错误:
TrinoUserError(type=USER_ERROR, name=MISSING_SCHEMA_NAME, message="line 1:16: Schema must be specified when session schema is not set", query_id=20220908_082529_00009_uw5yi)
解决方法
方法1:连接时指定默认catalog和schema
直接在创建Trino连接时设置默认的catalog和schema,后续查询无需执行use语句,自动继承上下文:
from trino.dbapi import connect conn = connect( host="你的Trino主机地址", port=8080, user="你的用户名", catalog="目标catalog名称", # 例如hive、mysql等 schema="test" ) cursor = conn.cursor() # 直接执行查询 cursor.execute("select * from tbl") rows = cursor.fetchall()
方法2:查询时显式指定完整表路径
放弃使用use语句,在SELECT中直接写全表的完整路径(catalog.schema.table),避免依赖会话上下文:
# 替换为你的实际catalog名称 cursor.execute("select * from your_catalog.test.tbl") rows = cursor.fetchall()
方法3:修正USE语句并确保会话上下文生效
如果一定要保留use语句,需指定完整的catalog.schema,同时拆分后清理语句空格并确保读取执行结果:
query = "use your_catalog.test; select * from tbl" # 拆分后清理每个语句的前后空格,过滤空字符串 queries = [q.strip() for q in query.split(";") if q.strip()] rows = [] for single_query in queries: cursor.execute(single_query) # 读取结果,确保语句执行完成并更新会话上下文 result = cursor.fetchall() # 仅保留SELECT语句的查询结果 if "select" in single_query.lower(): rows = result
内容的提问来源于stack exchange,提问作者user8619101
相关产品推荐
相关产品推荐

