如何过滤 SQLAlchemy MutableList 列

问题描述 投票:0回答:2

我正在尝试过滤定义为 MutableList 的列,但我不确定如何执行此操作,或者是否可能?

这是我迄今为止尝试过的:

from sqlalchemy import Column, String, Integer, PickleType
from sqlalchemy.ext.mutable import MutableList

class MyClass(db.Model):
    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, index=True)
    name = Column(String(100), nullable=False)
    name_list = Column(MutableList.as_mutable(PickleType), default=[])

search_val = ['test']

new = MyClass(
  name="foo",
  name_list=search_val
)
db.session.add(new)
db.session.commit()

q1 = MyClass.query.filter(MyClass.name_list.in_(search_val)).first()

不返回任何结果。所以,我也尝试过——

q2 = MyClass.query.filter(MyClass.name_list == search_val).first()

但是,也没有结果。最后——

search_val_2 = 'test'
q3 = MyClass.query.filter(MyClass.name_list.in_(search_val_2)).first()

但是,这会导致 ArgumentError --

sqlalchemy.exc.ArgumentError: IN expression list, SELECT construct, or bound parameter object expected, got 'test'.

底层数据库是MariaDB,我使用的是Flask SQLAlchemy。

sqlalchemy flask-sqlalchemy mutablelist
2个回答
0
投票

SQLAlchemy 将

MutableList
列映射到
VARCHAR
BINARY
列类型。

Python Pickle 模块用于根据列表中的任何数据生成二进制有效负载。

pickle 的二进制数据的任何内容对于 SQL 来说都是不透明的。因此,SQL 无法搜索或读取它,因为 Pickle 是 Python 特有的,只有 Python 程序才能读取 pickle 数据。

要拥有 SQL 可搜索列表,您需要在 SQLAlchemy 模型中使用 SQL 本机关系映射器。您需要构造另一个表,其中每个列表实体包含一行。


0
投票

你可以使用

== any_

MyClass.name_list == any_(*search_val_list)

在这种情况下

© www.soinside.com 2019 - 2024. All rights reserved.