SQLAlchemy 无法查询 json -“Comparator”对象具有属性“as_text”

klf*_*wip 6 postgresql json sqlalchemy filter alembic

我正在尝试使用 SQLAlchemy 编写一个查询,该查询使用 JSON 字段进行搜索,如下所示

records = db_session.query(Resource).filter(
              Resources.data["lastname"].astext == "Doe"
          ).all()
Run Code Online (Sandbox Code Playgroud)

所以就我而言,我写道:

records = session.query(Watch).filter(
    Watch.filter_data['session_uuid'].as_text == keys['session_uuid'],
)
Run Code Online (Sandbox Code Playgroud)

这给了我结果AttributeError: Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'as_text'

我也尝试像这样修改我的代码:

records = session.query(Watch).filter(
    Watch.filter_data.as_text == keys['session_uuid'],
)
Run Code Online (Sandbox Code Playgroud)

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Watch.filter_data has an attribute 'as_text'

基本上,我根本无法执行任何 JSON 查询,而且我现在也不知道为什么。我注意到在上面的代码示例中,他们使用Resourceand Resources- 两个单独的对象,但我不知道每个对象的实现是什么样的,所以这对我没有多大帮助。

我使用 Alembic 定义该字段,如下所示:sa.Column('filter_data', sa.JSON(), nullable=False),

我对这一行的映射如下所示:

class Watch(Base):
    __tablename__ = 'watch'
    filter_data = Column(sa.JSON(), nullable=False)
    filter_type = Column(sa.Text(), nullable=False)
Run Code Online (Sandbox Code Playgroud)

据推测,我根本不应该Watch.filter_data在查询中使用,但是在这种情况下我实际上应该用什么来过滤?文档中有许多示例,其中使用映射类的属性来过滤映射类

例如:

q = session.query(User).filter(User.name == 'fred')
Run Code Online (Sandbox Code Playgroud)

像这样的过滤对我来说效果很好。您知道我需要做什么才能使其与 JSON 查询一起使用,而不是仅限于直接字符串比较吗?

编辑:我还发现了以下内容。如果我使用

session.query(Watch).filter(sa.Column('filter_data', JSON(), nullable=False)['session_uuid'].astext == keys['session_uuid']).all()
Run Code Online (Sandbox Code Playgroud)

然后我的查询就会起作用。

但如果我使用

session.query(Watch).filter(Watch.__table__.c.filter_data['session_uuid'].astext == keys['session_uuid']).all()
Run Code Online (Sandbox Code Playgroud)

查询失败。尽管我将 filter_data 定义为

op.create_table(
    'watch',
    sa.Column('filter_data', JSON(astext_type=sa.Text()), nullable=False),
)
Run Code Online (Sandbox Code Playgroud)

理论上,这些列应该具有完全相同的类型,但我无法使用 alembic 认为具有的字段类型进行查询

所以这可能是 alembic 如何处理我给该领域的类型的问题。