SQLAlchemy无法查询json-';比较器';对象具有属性';作为文本';

SQLAlchemy无法查询json-';比较器';对象具有属性';作为文本';,json,postgresql,filter,sqlalchemy,alembic,Json,Postgresql,Filter,Sqlalchemy,Alembic,我尝试使用SQLAlchemy编写一个查询,该查询使用JSON字段进行搜索,如下所示: 因此,在我的案例中,我写道: records = session.query(Watch).filter( Watch.filter_data['session_uuid'].as_text == keys['session_uuid'], ) 这给了我一个结果AttributeError:“BinaryExpression”对象和“Comparator”对象都没有属性“as\u text” 我还尝

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

因此,在我的案例中,我写道:

records = session.query(Watch).filter(
    Watch.filter_data['session_uuid'].as_text == keys['session_uuid'],
)
这给了我一个结果
AttributeError:“BinaryExpression”对象和“Comparator”对象都没有属性“as\u text”

我还尝试过这样修改代码:

records = session.query(Watch).filter(
    Watch.filter_data.as_text == keys['session_uuid'],
)
class Watch(Base):
    __tablename__ = 'watch'
    filter_data = Column(sa.JSON(), nullable=False)
    filter_type = Column(sa.Text(), nullable=False)
AttributeError:与Watch.filter\u数据关联的“InstrumentedAttribute”对象和“Comparator”对象都没有“as\u text”属性。

基本上,我根本不能做任何JSON查询,我也不知道这是为什么。我注意到在上面的代码示例中,他们使用了
Resource
Resources
——两个独立的对象,但我不知道每个对象的实现是什么样子的,因此这对我没有多大帮助

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

这一行的映射如下所示:

records = session.query(Watch).filter(
    Watch.filter_data.as_text == keys['session_uuid'],
)
class Watch(Base):
    __tablename__ = 'watch'
    filter_data = Column(sa.JSON(), nullable=False)
    filter_type = Column(sa.Text(), nullable=False)
大概,我根本不应该在查询中使用
Watch.filter\u 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_数据定义为

op.create_table(
    'watch',
    sa.Column('filter_data', JSON(astext_type=sa.Text()), nullable=False),
)
理论上,这些列应该具有完全相同的类型,但我不能使用alembic认为具有的字段类型进行查询


因此,这可能是alembic如何处理我提供给字段的类型的问题。

Watch.filter\u data['session\u uuid']。as\u text
当然会失败,因为
as\u text
是一个打字错误。请注意,您在alembic迁移中使用的类型(
op.create_表(…)
)不会影响您的模型,这似乎是在使用泛型的
sqlalchemy.types.JSON
类型,而该类型目前缺少
astext
转换。@IljaEverilä有没有办法通过对泛型JSON类型的
astext
进行强制转换,从JSON字段中获取普通字符串而不是原始unicode?