代码之家  ›  专栏  ›  技术社区  ›  ivo

在SQLAlchemy中,是否可以在使用声明性样式时声明级联关系?

  •  0
  • ivo  · 技术社区  · 14 年前

    在sqlAlchemy中,我们可以这样声明表及其关系:

    user = Table(
        'users', metadata,
        Column('id', Integer, primary_key=True))
    
    address = Table(
        'adresses', metadata,
        Column('id', Integer, primary_key=True),
        Column('user_id', Integer, ForeignKey('user.id')))
    
    class User(object): pass
    
    class Address(object): pass
    
    session.mapper(User, user, properties=dict(
        'address' = relation(Address, backref='user', cascade="all")))
    

    (请注意 叶栅 上一行中的关系。)

    但是,我们也可以使用替代方案 速记 样式,调用 陈述式风格 ,其中我们可以用更少的代码行表示相同的内容,省略mapper()关系:

    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
    
    class Adress(Base):
        __tablename__ = 'adresses'
        id = Column(Integer, primary_key=True)
        user_id = Column(Integer, ForeignKey('user.id')))
    

    但是,如果我们使用这种声明性风格,是否有其他方法来定义级联关系?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Peter Hansen    14 年前

    实际上,使用“声明性”并不意味着省略了关系。您仍然以大致相同的方式指定它们,但直接在类上作为属性而不是在映射器中指定:

    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        address = relation('Address', backref='user', cascade='all')
    
    class Address(Base):
        __tablename__ = 'addresses'
        id = Column(Integer, primary_key=True)
        user_id = Column(Integer, ForeignKey('users.id'))
    

    (请注意,我已经纠正了“地址”的拼写,以防您剪切和粘贴此地址。)

    这个 declarative documentation 涵盖这一点。注意,在简单的情况下,它可以计算出自动使用哪些外键,但如果需要,您可以更明确地说明。

    同时注意使用 一串 'Address' 从那时起我用它在 User 类相关类尚未定义。