【问题标题】:How can I inherit a class which inherits db.Model如何继承继承 db.Model 的类
【发布时间】:2020-05-07 08:35:39
【问题描述】:

我尝试通过结合烧瓶应用程序使用 sqlalchemy 创建另一个 sql 表

我有一个类Table1db.model,它具有一些功能,我想通过创建另一个带有一些额外列(继承现有列)的Table2 类表来使用它的功能,不幸的是,当我尝试这样做,SQLAlchemy 的自动表单机制不会像其他继承 db.model 的类那样创建 table

db = SQLAlchemy(app)

class Table1(db.Model):
   __tablename__ = "table1"

   id                   = db.Column(db.String(36),  primary_key=True)

class Table2(Table1):
   __tablename__ = "table2"

   id                   = db.Column(db.String(36),  primary_key=True)
   extra_column         = db.Column(db.String(36),  primary_key=True)

【问题讨论】:

  • @snakecharmerb 是的,但我继承的是 db.Model 而不是 declarative_base
  • 只是一个猜测,但你需要super() Table1 in __init__ for Table2 吗?
  • @match class Table2(Table1): def __init__(self): self.super() self.__tablename__ = "table2" 我这样做了,但它不起作用
  • db.Model 是一个声明性基类,尽管是自定义的。您似乎正在尝试设置联合继承,但子模型没有对父模型的外键引用。 Table2.id 看起来应该是那个引用,但是让extra_columnid 形成一个复合主键会搞砸。仔细想想,不合逻辑。只有子表的一行应该引用父行,否则Table2 的 2 个实例将共享状态(存储在 table1 中)。
  • 另外一个未创建表的常见原因是在调用db.create_all() 等时模型还不存在。换句话说,它还没有被导入/包含它的模块被评估,所以它在那个时候不存在。

标签: python sql flask sqlalchemy


【解决方案1】:

您必须将__abstract__ = True 添加到 Table1 但 SQLAlchemy ORM 系统不会创建 Table1

      db = SQLAlchemy(app)



      class Table1(db.Model):
           __tablename__ = "table1"
           __abstract__ = True

           id                   = db.Column(db.String(36),  primary_key=True)

        class Table2(Table1):
           __tablename__ = "table2"

           id                   = db.Column(db.String(36),  primary_key=True)
           extra_column         = db.Column(db.String(36),  primary_key=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多