使用Postgres在SqlAlchemy模型中动态生成的字段 [英] Dynamically generated field in SqlAlchemy model with Postgres

查看:143
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆