Как я могу иметь две таблицы A и B, где B имеет все столбцы A? - PullRequest
0 голосов
/ 23 июня 2019

Я сейчас создаю 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 голосов
/ 23 июня 2019

Это похоже на грязный хак, и я не совсем уверен, работает ли он так, как ожидалось, но это может дать некоторое вдохновение;)

Идея состоит в том, чтобы создать класс PageRevision динамически, копируя поляPage.

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)}
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...