Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLAlchemy中,使用声明式样式时是否可以声明级联关系?_Sqlalchemy - Fatal编程技术网

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

在SQLAlchemy中,使用声明式样式时是否可以声明级联关系?,sqlalchemy,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

在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')))
但是,如果我们使用这种声明式样式,是否有其他方法来定义级联关系?

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

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'))
(请注意,我已修复了“地址”的拼写,以防您剪切并粘贴它。)

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

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

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

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'))
(请注意,我已修复了“地址”的拼写,以防您剪切并粘贴它。)

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

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