我如何有两个表A和B,其中B具有A的所有列?

时间:2019-06-23 12:53:45

标签: python sqlalchemy

我目前正在建立CMS。我想要一个page表和一个page_revision表,其中page_revision的所有列都是page + rev_id + rev_parent_id

MVCE

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Page(db.Model):
    __tablename__ = 'pages'
    page_id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text(), default='', nullable=False)

class PageRevision(Page):
    __tablename__ = 'pages_revisions'
    rev_id = db.Column(db.Integer, primary_key=True)
    rev_parent_id = db.Column(db.Integer, nullable=True)

尝试flask db migrate时出现错误:

sqlalchemy.exc.NoForeignKeysError: Can't find any foreign key relationships between 'pages' and 'pages_revisions'.

我不确定会发生什么。我想做的是复制结构,但是我不希望从面向对象的角度继承。

有没有一种方法可以简单复制并粘贴所有列(使page_id不是主键)?

1 个答案:

答案 0 :(得分:0)

这感觉像是一堆肮脏的东西,我不确定它是否能按预期工作,但可能会有所启发;)

想法是通过复制Page的字段来动态创建PageRevision类。

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class Page(db.Model):
    __tablename__ = 'pages'
    page_id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text(), default='', nullable=False)


def columns_of_table(table_type):
    for col in Page.__table__.columns:
        yield col.key, db.Column(col.type, default=col.default, nullable=col.nullable, primary_key=False)


PageRevision = type('PageRevision', (db.Model, ), {
    'rev_id': db.Column(db.Integer, primary_key=True),
    'rev_parent_id': db.Column(db.Integer, nullable=True),
    **{key: col for key, col in columns_of_table(Page)}
})