首页 > 解决方案 > 在 Flask-SqlAlchemy 和 MySQL 中处理数组

问题描述

我有一个数据模型,我在其中存储以逗号分隔的值列表(1、2、3、4、5 ...)。

在我的代码中,为了使用arrays而不是string,我定义了这样的模型:

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”string是一个数组,它只有在存储在数据库中时才会转换为。

当我尝试按该字段过滤时出现问题。像这样的表达式不起作用:

MyModel.query.filter_by(fake_array="1").all()

似乎我无法使用SqlAlchemy查询模型进行过滤。

我可以在这里做什么?有没有办法过滤这种字段?“fake_array”问题是否有更好的模式?

谢谢!

标签: pythonpython-3.xsqlalchemyflask-sqlalchemy

解决方案


你想要做的应该真的被一对表和它们之间的关系所取代。

第一个表(我将其称为 A)包含除数组列之外的所有内容,并且它应该具有某种主键。您应该有另一个表(我将其称为 B),其中包含一个主键、一个指向 A 的外键列(我将其称为 a_id,以及一个整数字段。

使用这种布局,A 表中的每一行在表 B 中都有其关联的数组,其中 B 的 a_id == A.id 通过连接。您可以通过操作表 B 中的行来添加或删除数组中的值。您可以使用连接进行过滤。

如果需要值的顺序,则在表 B 中创建一个顺序列。


推荐阅读