首页 > 解决方案 > 如何在 sqlalchemy 中组合同一类的数据库存储实例和应用程序硬编码实例?

问题描述

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

我想允许用户添加他们自己的科目并将它们用作学校专业。

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

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

有更明智的方法吗?

标签: python-3.xsqlalchemy

解决方案


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

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

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

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

然后将列定义为

Column('value', Enum(MyEnum))

然后将您的数据库列填充为:“数学”、“英语”、“艺术”


推荐阅读