我正在尝试使用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查询,而且我不知道为什么会这样。我注意到在上面的代码示例中,他们正在使用Resource
和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)
据推测,我根本不应该在我的查询中使用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如何处理我给该领域的类型的问题。