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 如何处理我给该领域的类型的问题。
| 归档时间: |
|
| 查看次数: |
3560 次 |
| 最近记录: |