我想为Float类型的每一小时创建一个包含列的表。 我如何摆脱这种冗长的语法:
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< = value< = 1)?
作为验证?那么如何为24个字段整齐地设置验证?
我可以用SqlAlchemy添加检查约束吗?
答案 0 :(得分:0)
这里的关键是要意识到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
块只是一个代码块,所以你可以把循环放在那里:
byte[] send = new byte[5 + 2];
send[0] = 0x81; // last frame, text
send[1] = 5; // not masked, length 5
send[2] = (byte)'x';
send[3] = (byte)'Y';
send[4] = (byte)'z';
send[5] = (byte)'A';
send[6] = (byte)'B';
client.Send(send);
答案 1 :(得分:-1)
您可能需要使用调用super().__init__(*args, **kwargs)
的顺序,但理论上这应该可行。
至于验证,validates
装饰器的优点在于它需要多个列名,因此我们可以实现动态字段创建和验证,如下所示:
from app import db
from sqlalchemy.orm import validates
class HourlySchedule(db.Model):
id = db.Column(
db.Integer,
primary_key=True
)
def __init__(self, *args, **kwargs):
self.colstrings = []
for hour in range(0, 24):
colstring = "h{}".format(hour)
setattr(self, colstring, db.Column(db.Float, nullable=True))
self.colstrings.append(colstring)
super().__init__(*args, **kwargs)
@validates(*self.colstrings)
def validate_hours(self, key, hour):
assert 0 < hour < 1
return hour
然而,我要注意的一件事是,这实际上大大增加了一个相当简单的概念的复杂性。而不是隐藏模型细节,这是详细的,所以开发人员可以很容易地理解模型&gt;表格映射,列出每一列可能更有意义,或者重新考虑如何构建数据。