python - 在 Flask-SqlAlchemy 和 MySQL 中处理数组

标签 python python-3.x sqlalchemy flask-sqlalchemy

我有一个数据模型,其中存储以逗号分隔的值列表(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/

相关文章:

python-3.x - 与元组/字典/类相比,namedtuple 慢

Python SQLAlchemy - 更新子模型时更新父模型的时间戳

python - PyQt - 如何在类销毁时关闭数据库连接

python - 有什么办法可以在 sympy 中进行整数除法?

python - 如何在 python 上生成安全 session_id ?

python - vscode "python.jediEnabled": false, 显示为未知配置设置

python - Sqlalchemy:二次关系更新

python - Plotly:如何删除使用 add_annotation() 创建的箭头尾部后面的间隙?

iphone - 在 objective-c 中取消hexlify

python - 从嵌套字典创建单个字典以更新 MySQLdb