Python SqlAlchemy + MySql 通过 JSON 列数据过滤

Dor*_*lon 2 python mysql sqlalchemy

我有一个带有 JSON 列的Movies表,定义为:

movie_info = Column('movie_info', JsonEncodedDict)
Run Code Online (Sandbox Code Playgroud)

其中 JsonEncodedDict:

class JsonEncodedDict(TypeDecorator):
    impl = Text

    def process_bind_param(self, value, dialect):
        if value is None:
            return '{}'
        else:
            return json.dumps(value)

    def process_result_value(self, value, dialect):
        if value is None:
            return {}
        else:
            return json.loads(value)
Run Code Online (Sandbox Code Playgroud)

插入工作按预期进行。当我想要查询数据并对我的列执行过滤时,我的问题就开始了。假设我有一条记录,其中movie_info列是:

{
    "title": "The Movie - 3",
    "review": "Best movie I have ever seen"
}
Run Code Online (Sandbox Code Playgroud)

我想查询我的表并获取评论包含“最佳”的所有记录

我尝试过类似的事情

session.query(Movies).filter('best' in Movies.movie_info['review']).all()

session.query(Movie).filter('best' in func.json_compare(Movies.movie_info['review'])).all()
Run Code Online (Sandbox Code Playgroud)

还有几个查询,但没有任何效果。任何想法将不胜感激

Dor*_*lon 6

速度很快,但我找到了解决方案。我不会删除这个问题,因为我还没有在网上找到任何答案,所以我相信这对其他人会有帮助。

使用 json_extract 而不是 json_contains:

session.query(Movies).filter(func.json_extract(Movies.movie_info, '$.review').ilike('%best%')).all()
Run Code Online (Sandbox Code Playgroud)