在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')))
但是如果我们使用这种声明式样式,是否有另一种方法来定义级联关系?
答案 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
类中使用它时,尚未定义相关类。