SQLALCHEMY의 기본 관계 모드

6294 단어
아래에 언급된 코드는 모두 다음과 같은 종류나 속성을 가져왔다
from sqlalchemy import Table,Column,Integer,ForeignKey
from sqlalchemy.orm import relationship,backref
from sqlalchemy.ext.declarative import declarative_base
Base=declarative_base() # 이 클래스의 하위 클래스는 자동으로 테이블과 연결됩니다.
일대다 관계:
Parent 클래스를 "1"섹션으로 설정하고 Child 클래스를 "다"섹션으로 설정합니다.다음과 같은 코드가 있습니다.
class Parent(Base):
    __tablename__='parent'   #         parent  
    id=Column(Integer,primary_key=True)
    children=relationship("Child")
class Child(Base):
    __tablename__='child'
    id=Column(Integer,primary_key=True)
    parent_id=Column(Integer,ForeignKey('parent.id'))

'다중' 부분에 Relationship () 를 설정합니다."1"부분에서 외부 키를 설정합니다.
sqlalchemy.orm.relationship(argument, secondary=None, primaryjoin=None, secondaryjoin=None, foreign_keys=None, uselist=None, order_by=False, backref=None, back_populates=None, post_update=False, cascade=False, extension=None, viewonly=False, lazy=True, collection_class=None, passive_deletes=False, passive_updates=True, remote_side=None, enable_typechecks=True, join_depth=None, comparator_factory=None, single_parent=False, innerjoin=False, distinct_target_key=None, doc=None, active_history=False, cascade_backrefs=True, load_on_pending=False, strategy_class=None, _local_remote_pairs=None, query_class=None, info=None)
양방향 연결을 만들기 위해서,relationship () 에backref를 설정합니다.
class Parent(Base):
    __tablename__='parent'
    id=Column(Integer,primary_key=True)
    children=relationship("Child",backref="parent")
class Child(Base):
    __tablename__='child'
    id=Column(Integer,primary_key=True)
    parent_id=Column(Integer,ForeignKey('parent.id'))

이때child는parent의 속성을 얻을 수 있습니다.여child.parent.id.backref는 역인용으로 차일드 클래스에 새로운 속성parent를 표시합니다.
일대일:
일대다와 반대로 상술한 일대다를 참고하다
일대일:
일대일은 상기 일대다 전환을 참고할 수 있으며, Relationship () 의uselist를False로 설정해야 합니다.
class Parent(Base):
    __tablename__='parent'
    id=Column(Integer,primary_key=True)
    child=relationship("Child",uselist=False,backref="parent")
class Child(Base):
    __tablename__='child'
    id=Column(Integer,primary_key=True)
    parent_id=Column(Integer,ForeignKey('parent.id'))

여러 쌍:
다대다의 관계를 나타내기 위해서는 하나의 관계표를 도입해야 한다. 이 관계표에 대해 모델을 사용하지 않고 실제 표를 채택하는 것을 강력히 권장한다.
Table 클래스를 가져오고,relationship () 에서 secondary 옵션을 설정해야 합니다.관계표의 열은 다른 두 표의 키입니다.Table 클래스는 declarative base 클래스와 연관시키기 위해 일반적으로 MetaData를 사용합니다.
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,backref="parent")
class Child(Base):
    __tablename__='right'
    id=Column(Integer,primary_key=True)

양방향 관계를 만들기 위해backref 키워드를 추가합니다:
ssociation_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)

secondary는 다음 두 가지 형식도 사용할 수 있습니다.
1、The secondary argument of relationship() also accepts a callable that returns the ultimate argument, which is evaluated only when mappers are first used.예를 들어 secondary=lambda:associationtable
2、string name of the table:secondary="association"
여러 쌍의 테이블에서 행을 삭제하려면 다음과 같이 하십시오.
myparent.children.remove(somechild)가 기록을 삭제하면 해당 줄은 자동으로'secondary'테이블에서 삭제되며 인공적으로 삭제할 필요가 없습니다.
근데 세션 같아.delete(somechild)는 이렇게 기록을 삭제하고 해당하는'secondary'테이블에 있는 기록은 상황에 따라 토론한다. 1. 만약parent에서child에 관계가 존재하지만child에서parent에 관계가 없다면(관계가 양방향이 아니다)'secondary'테이블에서 삭제되지 않는다.
2. 관계가 양방향이면'secondary'테이블에서 자동으로 삭제됩니다.
3. 데이터베이스가 ON DELETE CASCADE(캐스케이드 삭제)를 지원할 경우 데이터는 "secondary"table에서 삭제됩니다.
연결 대상:
여러 쌍의 관계식에 대해 Tabel 테이블의 열에는 두 개의 외부 키가 포함되어 있습니다.테이블에 추가 정보가 포함된 경우 Association 클래스를 사용할 수 있습니다.Parent에서 Association까지는 일대다입니다.Association에서 Child까지는 다대일입니다.
class Association(Base):
    __tablename__='asscociation'
    left_id=Column(Integer,ForeignKey('left.id'),primary_key=True)
    right_id=Column(Integer,ForeignKey('right.id'),primary_key=True)
    extra_data=Column(String(50))    #    
    child=relationship("Child")
class Parent(Base):
    __tablename__='left'
    id=Column(Integer,primary_key=True)
    children=relationship('Association')
class Child(Base):
    __tablename__='right'
    id=Column(Integer,primary_key=True)

양방향 관계를 맺으면relationship에backref 속성을 추가합니다.
class Association(Base):
    __tablename__ = 'association'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
    extra_data = Column(String(50))
    child = relationship("Child", backref="parent_assocs")
class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Association", backref="parent")
class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)

상기 association 모드를 사용하면 데이터를 추가할 때 차일드 실례를 Association과 연결한 다음에 차일드를 parent에 추가합니다.
p=Parent()
a=Association(extra_data="some data")
a.child=Child()
p.children.append(a)
child 객체 및 association 등록 정보를 누비면 association을 통해 액세스할 수 있습니다.
for assoc in p.children:
    print assoc.extra_data
    print assoc.child
텍스트:http://docs.sqlalchemy.org/en/rel_0_9/orm/basic_relationships.html

좋은 웹페이지 즐겨찾기