2016-02-25 2 views
0

Я должен реализовать следующую потребность: сохранить «страницу» и «ревизии». Как:SQLAlchemy базы данных для пересмотра

class Page(Base): 
    __tablename__ = 'Page' 
    page_id = Column(Integer, primary_key=True) 

class Revision(Base): 
    __tablename__ = 'Revision' 
    revision_id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(32)) 
    content = Column(String(32)) 
    page_id = Column(Integer, ForeignKey('Page.page_id')) 
    page = relationship('Page', uselist=False, backref='revisions') 

Я хочу, чтобы иметь возможность получить страницу, и это содержание прозрачно нравится:

page = session.query(Page).filter(Page.page_id == 42).one() 
page.name 
page.content 

Я прочитал SQLAlchemy inheritance doc но я не знаю, если я не могу сделать это с наследованием.

Возможно ли это сделать? Как ?

+0

Я бы заглянул в «хранилище данных типа 2». В основном сохраняйте эффективную дату начала и эффективную дату окончания, при этом последняя дата окончания действия равна нулю. – reptilicus

ответ

0

Неверное определение ORM выше. Ошибка «наследования», которую вы получаете при попытке запустить этот код, вводит в заблуждение. Вы, например, не имеете ничего общего с наследованием, вам это не нужно. То, что вы пытаетесь моделировать, - это простая взаимосвязь «один ко многим» между страницей (одна) и версией (многие). Основные проблемы, связанные с вашим определением:

  1. это отсутствующим __tablename__
  2. Revision таблица отсутствует ссылка на Page (page_id)
  3. вашего определения page отношения неверны

здесь является правильным определением + полным пример (обратите внимание, что я также добавил autoincrement, поэтому вам не нужно генерировать первичные ключи):

class Page(Base): 
    __tablename__ = 'Page' 
    page_id = Column(Integer, primary_key=True, autoincrement=True) 

class Revision(Base): 
    __tablename__ = 'Revision' 
    revision_id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(32)) 
    content = Column(String(32)) 
    page_id = Column(Integer, ForeignKey('Page.page_id')) 
    page = relationship('Page', uselist=False, backref='revisions') 


page = Page() 
first_revision = Revision(name='first_revision', content='foo', page=page) 
second_revision = Revision(name='second_revision', content='bar', page=page) 
session.add_all([page, first_revision, second_revision]) 
session.flush() 
session.commit() 
for rev in page.revisions: 
    print rev.revision_id, rev.name, rev.content, rev.page_id 
+0

Код вопроса здесь, чтобы проиллюстрировать вопрос. Я редактирую его для будущих читателей. Ваш ответ не решает мой вопрос: мой вопрос недостаточно ясен? Я могу попытаться обновить его. – bux

Смежные вопросы