如何在Trino中结合SQLAlchemy ORM操作JSON列?
在Trino中用SQLAlchemy ORM操作JSON列的解决方案
可以实现,但需要绕过SQLAlchemy默认的JSON路径语法,改用Trino原生的JSON函数调用方式。
问题原因
你使用的postgresql.JSON类型会生成PostgreSQL风格的JSON操作语法(如->>),但Trino不兼容这种语法,它需要用json_extract函数提取JSON字段值,再配合cast转换为字符串类型才能使用IN条件。
修改后的代码示例
from sqlalchemy import create_engine, select, func, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import Session from sqlalchemy.schema import Table, Column, MetaData engine = create_engine(...) Base = declarative_base() table = Table( 'table', Base.metadata, Column('json_col', String), # 也可使用sqlalchemy.types.JSON,Trino会自动映射 autoload_with=engine, extend_existing=True ) with Session(engine) as session: test_ids = ['abc','def'] # 手动构造Trino兼容的JSON提取与类型转换逻辑 stmt = select(table).where( func.cast(func.json_extract(table.c.json_col, '$.key1.key2'), String).in_(test_ids) ) print(stmt) result = session.execute(stmt)
说明
- Trino的SQLAlchemy驱动目前对ORM风格的链式JSON路径查询(如
table.c.json['key1']['key2'])支持不完善,无法自动转换为Trino兼容的语法。 - 直接调用
func.json_extract和func.cast可以生成符合Trino要求的SQL:WHERE cast(json_extract(json_col,'$.key1.key2') as varchar) IN ('abc', 'def')
内容的提问来源于stack exchange,提问作者dwolfeu
相关产品推荐
相关产品推荐

