首页 > 解决方案 > 使用常量模式创建具有多列的模型

问题描述

我构建了与mysql数据库连接的烧瓶应用程序。

我尝试推入我的数据库表以保留列表(带有 500 个浮点数的向量)。

每个列名应该是vector_var_{number_of_element}

我想以聪明的方式做到这一点,而不是从手指声明 500 个字段。

class FaceVector(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    vector_var_1 = db.Column(db.Float)
    vector_var_2 = db.Column(db.Float)
    vector_var_3 = db.Column(db.Float)
    vector_var_4 = db.Column(db.Float)
    (...)
    vector_var_500 = db.Column(db.Float)

我考虑使用exec

field_pattern = 'vector_var_{}'
for iteration in range(500):
    exec("%s = %s" % (field_pattern.format(iteration), db.Column(db.Float)))

我不确定它是否安全,这是一个好习惯吗?

你对这个案子有更好的主意吗?

标签: pythonmysqlpython-3.xflask-sqlalchemy

解决方案


我使用序列化作为@Chase sugested。

https://docs.python-guide.org/scenarios/serialization/#numpy-array-flat-data

我将表定义更改为:

class FaceVector(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    vector = db.Column(db.Binary(4096))

在插入和读取数据期间,我使用了以下方法:

# Converting NumPy array to byte format
byte_output = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]).tobytes()

new_vector = models.FaceVector(vector=byte_output)


# Converting byte format back to NumPy array
array_format = np.frombuffer(byte_output_from_db)

推荐阅读