使用Postgres

时间:2016-07-24 10:22:22

标签: python flask sqlalchemy data-modeling

我想为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添加检查约束吗?

2 个答案:

答案 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;表格映射,列出每一列可能更有意义,或者重新考虑如何构建数据。