【问题标题】:Can I have array enum column with Flask-SQLAlchemy..?我可以有 Flask-SQLAlchemy 的数组枚举列吗?
【发布时间】:2019-09-22 13:29:30
【问题描述】:

我有一个案例来制作学生课程,其中还包含学生的时间表。我用 Flask-SQLAlchemy 制作了一个时间表模型,并使用 PostgreSQL 作为其数据库。

这是我当前代码的 sn-p:

class DayNameList(enum.Enum):
    Sunday = 'Sunday'
    Monday = 'Monday'
    Tuesday = 'Tuesday'
    Wednesday = 'Wednesday'
    Thursday = 'Thursday'
    Friday = 'Friday'
    Saturday = 'Saturday'

    def __str__(self):
        return self.value

class Schedule(db.Model):
    __tablename__ = 'schedule'
    id = db.Column(db.Integer, primary_key=True)
    schedule_day = db.Column(db.Enum(DayNameList, name='schedule_day'))
    start_at = db.Column(db.Time())
    end_at = db.Column(db.Time())
    # ...
    # ...

就我而言,学生每周有两个日程安排日。

在我当前的代码中,schedule_day 列是 Enum 类型。

所以,我的问题是,我是否应该将 schedule_day 设为 ARRAY Enum ..?如果是这样,start_atend_at 列如何......?我是否也应该将其转换为 @ 987654328@..?以及如何做到这一点的任何示例..?

或者我应该添加一个新列,即schedule_day_2 还是什么..?

什么是最佳实践..? 任何帮助将不胜感激,谢谢:)

【问题讨论】:

    标签: python postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    考虑为 ScheduleDay 创建单独的模型,该模型可能与您的 Schedule 以一对多关系相关。

    class Schedule(db.Model):
        __tablename__ = 'schedule'
        id = db.Column(db.Integer, primary_key=True)
        days = db.relationship('ScheduleDay', backref='schedule', lazy=True)
        # ...
        # ...
    
    class ScheduleDay(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        day = db.Column(db.Enum(DayNameList, name='schedule_day'))
        start_at = db.Column(db.Time())
        end_at = db.Column(db.Time())
        schedule_id = db.Column(db.Integer, db.ForeignKey('schedule.id'),
            nullable=False)
    

    如果某个星期有超过 2 天,那么您可以轻松添加更多天。

    例子:

    >>> schedule = Schedule()
    >>> db.session.add(schedule)
    >>> db.session.commit()
    >>> from datetime import time
    >>> monday_schedule = ScheduleDay(day=DayNameList.Monday, start_at=time(10, 15), end_at=time(12, 15), schedule_id=schedule.id)
    >>> db.session.add(monday_schedule)
    >>> tuesday_schedule = ScheduleDay(day=DayNameList.Tuesday, start_at=time(15, 15), end_at=time(17, 15), schedule_id=schedule.id)
    >>> db.session.add(tuesday_schedule)
    >>> db.session.commit()
    >>> schedule.days
    [<ScheduleDay 1>, <ScheduleDay 2>]
    >>> schedule.days[0].day
    <DayNameList.Monday: 'Monday'>
    >>> schedule.days[1].day
    <DayNameList.Tuesday: 'Tuesday'>
    

    【讨论】:

    • 您好,感谢您的回答,但您能否提供如何插入数据..?我可以将数据同时插入到两个表或两个表中吗?
    • @GofyanandKitty 看看我添加的示例。
    • 非常感谢 :)
    • 但是我使用这种方式:pastebin.com/raw/tN6YDzzU 如果我像我的方式一样使用追加的话,那是个好方法..?
    • 你可以做schedule.days.extend([schedule_day, schedule_day2])
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多