【问题标题】:Create model with many columns using a constant pattern使用常量模式创建具有多列的模型
【发布时间】:2020-10-12 21:48:06
【问题描述】:

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

我尝试推入我的数据库表以保留列表(具有 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)))

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

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

【问题讨论】:

  • 如果你想以一种聪明的方式来做,为什么不将所有 500 个值序列化到一个字段中呢?我认为这些都不需要索引,那为什么要 500 个单独的列呢?
  • 这听起来是个糟糕的设计

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


【解决方案1】:

我按照@Chase 的建议使用序列化。

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)

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2021-11-26
    相关资源
    最近更新 更多