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

时间:2010-03-01 11:34:19

标签: sqlalchemy

在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")))

(请注意上面一行中的级联关系。)

但是,我们也可以使用另一种简写样式,称为声明式样式,我们可以用更少的代码行表达相同的内容,省略映射器( )关系:

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 个答案:

答案 0 :(得分:5)

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

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类中使用它时,尚未定义相关类。