SQLAlchemy无法查询json - ' Comparator'对象有一个属性' as_text'

时间:2018-04-09 22:33:46

标签: json postgresql filter sqlalchemy alembic

我正在尝试使用SQLAlchemy编写一个查询,该查询使用类似here的JSON字段进行搜索:

records = db_session.query(Resource).filter(
              Resources.data["lastname"].astext == "Doe"
          ).all()

所以在我的情况下我写道:

records = session.query(Watch).filter(
    Watch.filter_data['session_uuid'].as_text == keys['session_uuid'],
)

这给了我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'],
)

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

基本上,我根本无法进行任何JSON查询,而且我不知道为什么会这样。我注意到在上面的代码示例中,他们正在使用ResourceResources - 两个独立的对象,但我不知道每个对象的实现是什么样的,这对我没什么帮助。

我使用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)

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

过滤映射的类

例如:

q = session.query(User).filter(User.name == 'fred')

这样过滤对我来说很好。您是否知道我需要做些什么才能使用JSON查询而不是仅限于直接字符串比较?

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

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

然后我的查询就可以了。

但如果我使用

session.query(Watch).filter(Watch.__table__.c.filter_data['session_uuid'].astext == keys['session_uuid']).all()

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

op.create_table(
    'watch',
    sa.Column('filter_data', JSON(astext_type=sa.Text()), nullable=False),
)

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

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

0 个答案:

没有答案