【问题标题】:Dealing with Arrays in Flask-SqlAlchemy and MySQL在 Flask-SqlAlchemy 和 MySQL 中处理数组
【发布时间】:2019-08-13 14:25:49
【问题描述】:

我有一个数据模型,用于存储以逗号 (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" 问题是否有更好的模式?

谢谢!

【问题讨论】:

  • 想象这是纯 SQL,您的查询会是什么样子?或者您是否接受查询不过滤但之后在 Python 中过滤的解决方案?
  • 我希望这样:MyModel.query.filter_by(fake_array="1").all() --> Select * From MyModel where fake_array = '1'
  • 还有这个事件:MyModel.query.filter(MyModel.fake_array.like('%1%')).all() --> Select * From MyModel where fake_array like '%1%'

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


【解决方案1】:

你真正要做的应该是用一对表和它们之间的关系来代替。

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

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

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

【讨论】:

  • 当然!这将是严格关系模型中的最佳解决方案。但有时我更喜欢在我的代码中使用这种技巧,而不是大量的表格。请不要为此杀了我;)。
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 2022-07-09
  • 2019-02-04
  • 2021-04-04
  • 2015-03-25
  • 2014-12-08
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多