flask-sqlalchemy 一对一,一对多,多对多操作

18 篇文章 0 订阅

一对多

class Parent(db.Model):
    id=db.Column(db.Integer,primary_key=True)
    
    name=db.Column(db.String(30),unique=True)
    
  	# children是关系的名字,Parent的实例对象可以通过children来查询其对应的有那些图书
    # Child是该关系对应的模型类类名,名字是类名,不能随意起
    # backref='parent'是回调的引用,parent是自定义的名字,
    # children的实例对习惯可以通过parent来查询其对应的作者
    
    children=db.relationship("Child",backref="parent")

class Child(db.Model):

    id=db.Column(db.Integer,primary_key=True)
    
    name=db.Column(db.String(30),unique=True)
    
    # Child的外键,db.ForeignKey('parent.id')里面必须是('引用的表表名.引用表的主键')
    
    parent_id=db.Column(db.Integer,db.ForeignKey('parent.id'))

创建数据库

>>>db.create_all()
插入数据:
>>>p1=Parent('p1')

>>>c1=Child('c1')

>>>c2=Child('c2')

>>>p1.children=[c1,c2]

>>>db.session.add(p1)

>>>db.session.commit()

此时,表parent和表child中都插入了数据。

或:

>>>pa=Parent(''p1')

>>>c1=Child('c1')

>>>c2=Child('c2')

>>>c1.parent=p1

>>>c2.parent=p2

>>>db.session.add(c1)

>>>db.session.add(c2)

>>>db.session.commit()

此时数据也被添加到数据库中了

查询
如果知道Child的姓名,想知道Parent的姓名,可以这样查:
Chi= Child.query.filter(Child.name == 'xxx').first()
Chi.parent.name    # stu.relate_class 会跳到 classes 表

如果知道Parent的名称,想返回全部Child的名字的列表,可以这样查:

Par= Parent.query.filter(Parent.name == 'xxx').first()
Par.children.name    # cls.relate_stu 会跳到 students 表一对一

可以使用这样的方法,有两个要求,第一是要设置外键

parent_id=db.Column(db.Integer,db.ForeignKey('parent.id'))

第二是这句语句:

children=db.relationship("Child",backref="parent")

一对一

一对一需要设置relationship中的uselist=Flase,其他数据库操作一样。

多对多

tags=db.Table('tags',db.Column('student_id',db.Integer,db.ForeignKey('student.id')),db.Column('course_id',db.Integer,db.ForeignKey('course.id')))
class Student(db.Model):
    __tablename__='student'
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(30))
    course=db.relationship('Course',secondary=tags)

class Course(db.Model):
    ___tablename__='course'
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(30),unique=True)
    #student_id=db.Column(db.Integer,db.ForeignKey('student.id'))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值