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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:32:16