sqlalchem表关联(一对多,一对一,多对多)

简介:

一:一对多关系

1.表示一对多的关系时,在子表类中通过 foreign key (外键)限制本列的值,然后,在父表类中通过 relationship() 方法来引用子表的类。

2.示例代码:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child")
   # 在父表类中通过 relationship() 方法来引用子表的类集合

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    # 在子表类中通过 foreign key (外键)引用父表的参考字段

 

3.

 

二:一对一关系

1.

2.

3.

 

三:多对多关系

1.

2.

3.

 

四:主要命令

示例代码:

class Parent(Base):
    __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child") # 在父表类中通过 relationship() 方法来引用子表的类集合 class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) # 在子表类中通过 foreign key (外键)引用父表的参考字段

 

1.ForeignKey

其含义为,其所在的列的值域应当被限制在另一个表的指定列的取值范围之类。这一特性是关系型数据库的核心特性之一。

并且关联到另一个类(数据库定义)

2.relationship

relationship相当于组合查询。

1.2组合,就能实现组合查询。

首先查找一个Parent,然后根据关联的parent.id,查找这个Parent的Child

#相当于,查过Parent,直接查出Child
dc=Session.query(Parent).filter(Parent.name == '河北').first()
dc.children=Session.query(Child).filter(Child.parent_id == 1).all()
print(dc)
print(dc.name)
print(dc.children)

3.backref

当你需要在一个表里面进设计多个relationship到一个表的时候。

需要backref来指定关联的列名。

示例代码:

 

class User_Jobs(Base):
    __tablename__ = 'user_jobs'
    id = Column(Integer, primary_key=True)
    worker = relationship("Users",backref='users.jobs_id')
    name = Column(String(20))
    # 在父表类中通过 relationship() 方法来引用子表的类集合
    def __repr__(self):
        return 'name:%s' % self.name

class User_Groups(Base):
    __tablename__ = 'user_groups'
    id = Column(Integer, primary_key=True)
    worker = relationship("Users",backref='users.groups_id')
    name = Column(String(20))
    # 在父表类中通过 relationship() 方法来引用子表的类集合
    def __repr__(self):
        return 'name:%s' % self.name


class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    jobs_id = Column(Integer, ForeignKey('user_jobs.id'), nullable=False)#这里用表名,不是类名
    job=relationship('User_Jobs')

    groups_id = Column(Integer, ForeignKey('user_groups.id'), nullable=False)  # 这里用表名,不是类名
    group = relationship('User_Groups')
    name = Column(String(20))
View Code

 

4.foreign_keys

 

5.secondary

连接多对多关系时,指定临时表用。是relationship的可选参数。

多对多关系,没有第三张临时表,是无法实现的。

使用Table来设计表,不用class类来设计表。

6.table

建立关系表用,不需要class类来建立表。

7.uselist

8.back_populates

总结:

1.

2.

3.

 

 

转载于:https://www.cnblogs.com/jackadam/p/9472274.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值