【问题标题】:How to combine database-stored and app-hardcoded instances of the same class in sqlalchemy?如何在 sqlalchemy 中组合同一类的数据库存储实例和应用程序硬编码实例?
【发布时间】:2019-12-08 17:56:27
【问题描述】:

我有一个包含多个类的应用程序,我们称它们为 SchoolSubject。我有包含学校列表的schools 表,我有包含主题列表的subjects 表。每所学校只能专攻一门学科,因此schools.spec_subject 是对subjects 表中条目之一的FK 引用,该表由SQLAchemy 通过School.spec_subject 属性处理。

我希望允许用户添加自己的科目并将其用作学校专业。

我想提供一个应用程序的硬编码主题列表,我希望能够使用该应用程序的未来版本对其进行更新,并且我不想提供更改这些硬编码主题的功能。所以本质上,我希望应用程序代码提供硬编码的主题并避免将它们存储在数据库中。

我怎样才能实现它?到目前为止,我想到的唯一方法是为此设置两列:schools.spec_subject_usersubjects 表有 FK,schools.spec_subject_builtin 仅存储内置主题的 ID。然后我只添加尝试访问spec_subject_user 的自定义getter,如果它为null - 使用取自spec_subject_builtin 的值获取内置主题。

有更明智的方法吗?

【问题讨论】:

    标签: python-3.x sqlalchemy


    【解决方案1】:

    您似乎在将可用值存储在数据库中和将它们存储在应用程序代码中发生冲突。

    我个人会使用数据库:如果其中存储了其他值,那么存储有效值的基本列表是一个明智的地方,并且它将自我保持完整性。

    但是您也可以使用存储在应用代码中的枚举类型:

    import enum
    class MyEnum(enum.Enum):
        maths = 'Mathematics'
        english = 'English'
        art = 'Fine Art'
    

    然后定义一列为

    Column('value', Enum(MyEnum))
    

    然后您的数据库列将被填充为:'maths'、'english'、'art'

    【讨论】:

    • 我的应用程序是可下载的,用户 SQLite DB 存储在用户 PC 上。在这种情况下,如果您想禁止用户编辑内置主题,您是否会通过单独的属性来禁止它们的修改,例如editable?如果你想用新的应用版本更新它们,你会通过 SQLAlchemy 迁移脚本来做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多