我有一个数据模型,其中存储以逗号分隔的值列表(1,2,3,4,5...)。
在我的代码中,为了使用数组
而不是字符串
,我定义了如下模型:
class MyModel(db.Model):
pk = db.Column(db.Integer, primary_key=True)
__fake_array = db.Column(db.String(500), name="fake_array")
@property
def fake_array(self):
if not self.__fake_array:
return
return self.__fake_array.split(',')
@fake_array.setter
def fake_array(self, value):
if value:
self.__fake_array = ",".join(value)
else:
self.__fake_array = None
这很完美,从我的源代码的角度来看“fake_array”是一个数组,它仅在以下情况下转换为字符串
它存储在数据库中。
当我尝试按该字段进行过滤时出现问题。像这样的表达式不起作用:
MyModel.query.filter_by(fake_array="1").all()
我似乎无法使用SqlAlchemy
查询模型进行过滤。
我在这里能做什么?有什么办法可以过滤这类字段吗?对于“fake_array”问题是否有更好的模式?
谢谢!
最佳答案
您想要做的事情实际上应该被替换为一对表以及它们之间的关系。
第一个表(我将其称为 A)包含除数组列之外的所有内容,并且它应该具有某种主键。您应该有另一个表(我将其称为 B),其中包含一个主键、A 的外键列(我将其称为 a_id)和一个整数字段。
使用此布局,A 表中的每一行在表 B 中都有其关联的数组,其中 B 的 a_id == A.id 通过联接。您可以通过操作表 B 中的行来添加或删除数组中的值。您可以使用联接进行过滤。
如果需要值的顺序,则在表 B 中创建一个顺序列。
关于python - 在 Flask-SqlAlchemy 和 MySQL 中处理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57479859/