使用Postgres在SqlAlchemy模型中动态生成的字段 [英] Dynamically generated field in SqlAlchemy model with Postgres
本文介绍了使用Postgres在SqlAlchemy模型中动态生成的字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想为Float类型一天中的每一小时创建一个带有列的表。
如何摆脱这种冗长的语法:
I want to create a table with a column for each hour of the day of Float type. How do I get rid of this verbose syntax:
from app import db
class HourlySchedule(db.Model):
id = db.Column(
db.Integer,
primary_key=True
)
h0 = db.Column(db.Float, nullable=True)
h1 = db.Column(db.Float, nullable=True)
h2 = db.Column(db.Float, nullable=True)
h3 = db.Column(db.Float, nullable=True)
h4 = db.Column(db.Float, nullable=True)
h5 = db.Column(db.Float, nullable=True)
h6 = db.Column(db.Float, nullable=True)
h7 = db.Column(db.Float, nullable=True)
h8 = db.Column(db.Float, nullable=True)
h9 = db.Column(db.Float, nullable=True)
h10 = db.Column(db.Float, nullable=True)
h11 = db.Column(db.Float, nullable=True)
h12 = db.Column(db.Float, nullable=True)
h13 = db.Column(db.Float, nullable=True)
h14 = db.Column(db.Float, nullable=True)
h15 = db.Column(db.Float, nullable=True)
h16 = db.Column(db.Float, nullable=True)
h17 = db.Column(db.Float, nullable=True)
h18 = db.Column(db.Float, nullable=True)
h19 = db.Column(db.Float, nullable=True)
h20 = db.Column(db.Float, nullable=True)
h21 = db.Column(db.Float, nullable=True)
h22 = db.Column(db.Float, nullable=True)
h23 = db.Column(db.Float, nullable=True)
另一个问题是如何对值执行检查(例如0< =值< = 1)?
Another question is how do I enforce checks on the values (e.g. 0 <= value <=1)?
作为验证?然后,如何为24个字段整齐地设置验证?
As validation? Then how do i set validation neatly for 24 fields?
我可以改为使用SqlAlchemy添加检查约束吗?
Can I instead add a check constraint with SqlAlchemy?
推荐答案
这里的关键是要意识到 class
块只是代码块,因此可以在其中放置循环:
The key here is to realize that a class
block is just a block of code, so you can put loops in there:
class HourlySchedule(db.Model):
id = db.Column(db.Integer, primary_key=True)
for i in range(24):
locals()["h{}".format(i)] = db.Column(db.Float)
@validates(*("h{}".format(i) for i in range(24)))
def _validate(self, k, h):
assert 0 <= h <= 1
return h
这篇关于使用Postgres在SqlAlchemy模型中动态生成的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文