python - 使用常量模式创建具有多列的模型
问题描述
我构建了与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)))
我不确定它是否安全,这是一个好习惯吗?
你对这个案子有更好的主意吗?
解决方案
我使用序列化作为@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)
推荐阅读
- rust - 如何使 Rust Game of Life WebAssembly 作为静态网站运行?
- linux - ngx_http_brotli_filter_module.so" 在 /etc/nginx/nginx.conf:1 中不是二进制兼容的
- maven - 使用 Maven 和 Jenkinsfile 拆分构建和单元测试,而不会丢失 jacoco 测试覆盖率
- c++ - 错误 LNK2001:我有一个简单的 Source.cpp 和 Graphs.h,即使 Source.cpp 有`#include "Graphs.h"`,我也会收到外部符号错误?
- game-engine - 如何在 Godot 中正确缩放图像/精灵?
- sql-server - Azure Data Studio 不记住或不保留连接
- docker - Hyperledger Fabric 对等 Docker 实例在网络设置后退出
- javascript - 是否可以在反应中使用 ag-grid 在单个列上应用多个过滤器?
- postman - Postman 缓存来自 API 的响应
- html - beautifulsoup - 当文本前面有 img 标签时,锚标签的过滤文本不起作用