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

ivo*_*ivo 0 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")))
Run Code Online (Sandbox Code Playgroud)

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

但是,我们也可以使用一种称为声明式样式的替代速记样式,在这种样式中我们可以用更少的代码行表达相同的东西,省略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')))
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用这种声明式样式,是否有另一种方法来定义级联关系?

Pet*_*sen 5

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

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'))
Run Code Online (Sandbox Code Playgroud)

(请注意,我已经修复了"地址"的拼写,以防你剪切并粘贴它.)

声明文档涵盖这一点.请注意,在简单的情况下,它会计算出自动使用的外键,但如果需要,您可以更明确.

还要注意字符串 的使用,'Address'因为当我在User类中使用它时,尚未定义相关的类.