python - 在 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”问题是否有更好的模式?
谢谢!
解决方案
你想要做的应该真的被一对表和它们之间的关系所取代。
第一个表(我将其称为 A)包含除数组列之外的所有内容,并且它应该具有某种主键。您应该有另一个表(我将其称为 B),其中包含一个主键、一个指向 A 的外键列(我将其称为 a_id,以及一个整数字段。
使用这种布局,A 表中的每一行在表 B 中都有其关联的数组,其中 B 的 a_id == A.id 通过连接。您可以通过操作表 B 中的行来添加或删除数组中的值。您可以使用连接进行过滤。
如果需要值的顺序,则在表 B 中创建一个顺序列。
推荐阅读
- jenkins - 如何在 Jenkins 文件(管道)中使用 Shared Libray 中的 groovy 常量?
- django - DRF 序列化器布尔字段不保存模型默认值
- c++ - C++ 抽象 Endian 是中性的吗?
- css - 更改 WHMCS 导航颜色
- python - 如何根据python列表中的内容以特定顺序/格式读取和打印列表?
- java - ResultSet 与表无关
- dialogflow-es - Dialogflow:如何重复以前的意图
- dynamics-crm - Prem 8.2 getGlobalContext 上的 Dynamics 不起作用,只有 Xrm.Page.Context 起作用
- javascript - 为什么点击变色js功能后img会不可见?
- reactjs - 在 React JS 中使用 font-awesome