我正在尝试过滤定义为 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 将
MutableList
列映射到 VARCHAR
或 BINARY
列类型。
Python Pickle 模块用于根据列表中的任何数据生成二进制有效负载。
pickle 的二进制数据的任何内容对于 SQL 来说都是不透明的。因此,SQL 无法搜索或读取它,因为 Pickle 是 Python 特有的,只有 Python 程序才能读取 pickle 数据。
要拥有 SQL 可搜索列表,您需要在 SQLAlchemy 模型中使用 SQL 本机关系映射器。您需要构造另一个表,其中每个列表实体包含一行。
你可以使用
== any_
MyClass.name_list == any_(*search_val_list)
在这种情况下