MyTetra Share
Делитесь знаниями!
Relationships SQLAlchemy / Построение связей в SQLAlchemy
Время создания: 11.10.2017 11:24
Раздел: SQLAlchemy
Запись: xintrea/mytetra_db_mcold/master/base/1507710259qvtmwh6n83/text.html на raw.githubusercontent.com

Построение связей в SQLAlchemy

Date  Wed 04 March 2015 Tags sqlalchemy / orm

Связи в sqlachemy бывают 4-х видов:


  • OTM (one-to-many) - один к многим
  • MTO (many-to-one) - многие к одному
  • OTO (one-to-one) - один к одному
  • MTM (many-to-many) - многие к многим

Релизация этих связей:

OTM :


Для указания связи OTM, создается колонка с ForeignKey в дочернем классе. При этом сама связь (relationship()) объявляется в Родителе. Для того что-бы получить по Ребенку Родителя, необходимо указать в relationship, свойство backref.

class Parent(Base):

__tablename__ = 'parents'

id = Column(Integer, primary_key=True)

child = relationship("Child", backfer='parents')


class Child(Base):

__tablename__ = 'childrens'

id = Column(Integer, primary_key=True)

parent_id = Column(Integer, ForeignKey('parents.id')


MTO :

Здесь построение отношения похоже на предыдущий, только ForeignKey указывается в Родителе, вместе с relationship()

class Parent(Base):

__tablename__ = 'parents'

id = Column(Integer, primary_key=True)

child_id = Column(Integer, ForeignKey('childs.id'))

child = relationship("Child", backref='parents')



class Child(Base):

__tablename__ = 'childs'

id = Column(Integer, primary_key=True)

OTO :

Со связью один-к-одному вообще всё просто, это та же связь один-к-многим, только в relationship добавляется еще одно свойство, которое вытягивает из другой таблицы только 1 элемент

class Parent(Base):

__tablename__ = 'parents'

id = Column(Integer, primary_key=True)

child = relationship("Child", uselist=False, backref='parents')


class Child(Base):

__tablename__ = 'childs'

id = Column(Integer, primary_key=True)

parent = Column(Integer, ForegnKey(parents.id))

Или

class Parent(Base):

__tablename__ = 'parents'

id = Column(Integer, primary_key=True)

child_id = Column(Integer, ForeignKey('childs.id'))

child = relationship("Child", backref=backref("parents", uselist=False))


class Child(Base):

__tablename__ = 'childs'

id = Column(Integer, primary_key=True)

MTM :

Данная связь реализуется при помощи вспомагательной ассоциативной таблицы, которую необходимо создать до создания связанных таблиц.

association_table = Table('association', Base.metadata,

Column('left_id', Integer, ForeignKey('left.id')),

Column('right_id', Integer, ForeignKey('right.id')))


class Parent(Base):

__tablename__ = 'left'

id = Column(Integer, primary_key=True)

children = relationship("Child",

secondary=association_table)


class Child(Base):

__tablename__ = 'right'

id = Column(Integer, primary_key=True)


стырено из официальной документации с вольным переводом оф.документация

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования