先进行如下操作:

from flask import Flask

from flask.ext.sqlalchemy import SQLAlchemy

app=Flask(__name__)

db=SQLAlchemy(app)

一对多:

class Parent(db.Model):

id=db.Column(db.Integer,primary_key=True)

name=db.Column(db.String(30),unique=True)

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

def __init__(self,name):

self.name=name

def __repr__(self):

return "name is %r" %self.name

class Child(db.Model):

id=db.Column(db.Integer,primary_key=True)

name=db.Column(db.String(30),unique=True)

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

def __init__(self,name):

self.name=name

def __repr__(self):

return "name is %r" %r

>>>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(p1)

>>>db.session.add(p2)

>>>db.session.commit()

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

修改数据:

>>>p=db.session.query(Parent).get(1)     #先查询出需要修改的条目

或:

>>>Parent.query.get(1)

然后

>>>p.name='p2'     #修改

>>>db.session.commit()     #修改成功,的确很方便

或者直接用一条语句:

#直接查询出后修改,update采用字典修改{修要修改的列:'修改后的值'}

>>>db.session.query(Child).filter(Child.id==1).update({Child.name:'c3'})

>>>db.session.commit()

删除数据:

首先需要查找出需要删除的数据:

>>>c=db.session.query(Child).filter(Child.id==2).first()    #找到一个类

然后将其删除:

>>>db.session.delete(c)

>>>db.session.commit()

删除parent和删除child一样,不过删除parent后,child的外键变为空(null)。

查询数据:

查询child所属的parent:

>>>db.session.query(Child).filter(Child.name=='c1').first().parent

或:

>>>Child.query.filter(Child.name=='c1').parent

查询parent的child:

>>>db.session.query(Parent).filter(Parent.name=='p1').first().children

或:

>>>Parent.query.filter(Child.name=='c1').children

一对一:

一对一需要设置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)
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        return "name:%r" %self.name
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'))
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        return "name:%r" %self.name

添加数据:

>>> s1=Student('s1')
>>> s2=Student('s2')
>>> c1=Course('c1')
>>> c2=Course('c2')
>>> c3=Course('c3')
>>> s1.course=[c1,c2,c3]
>>> s2.course=[c1,c2]
>>> db.session.add(s1)
>>> db.session.add(s2)
>>> db.session.commit()
此时,在course,student,tags中都添加了数据。

更新数据:

和其他关系的一样

查询数据:

和其他关系的一样

删除数据:

采用remove删除数据:
>>> db.session.query(Student).filter(Student.id==1).first().course.remove(c1)#仅仅从tags表中删除了

>>> db.session.commit()
如果从student到course存在关系,但从course到student没有关系(关系不是双向的),那么在“secondary” table中不会被删除。

如果关系是双向的,那么在“secondary” table中会自动删除。

>>> db.session.delete(s1)
>>> db.session.commit()

https://my.oschina.net/935572630/blog/373744

http://www.thatyou.cn/flask使用flask-sqlalchemy操作mysql数据库%EF%BC%88三%EF%BC%89-联表一对多查询/

http://www.bubuko.com/infodetail-1696901.html

flask-sqlalchemy 一对一,一对多,多对多操作的更多相关文章

  1. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  2. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...

  3. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  4. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  5. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  7. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  8. DjangoORM一对多&多对多操作

    简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 st ...

  9. Django一对多,多对多操作

    简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的 ...

  10. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

随机推荐

  1. Ansible playbook roles

    1  概述 角色(roles):如果我们使用playbook写成一个文件,这个文件会很大,但是不方便组织,我们可以分组,把playbook根据功能,如handler,tasks等分门别类的放在在各自的 ...

  2. CSS样式—— 字体、元素的垂直水平居中

    1.CSS样式与HTML中标签属性的区别: 标签的属性是采用 属性名=“属性值” 表示的 CSS样式是采用名值对 属性名:属性值: 表示的 2.内联元素(行内元素)与块元素 (1)内联元素及其特点: ...

  3. 性能测试 CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据

    CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据   by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 2 1.安装influxdb ...

  4. MySQL 横向表分区之RANGE分区小结

    MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...

  5. Android 7.0 新特性

    Android7.0提供新功能以提升性能.生产效率和安全性. 关于Android N的性能改进,Android N建立了先进的图形处理Vulkan系统,能少的减少对CPU的占用.与此同时,Androi ...

  6. 腾讯云 Game-Tech 技术沙龙小游戏专场“空降”长沙

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 小游戏作为今年快速成长的新生态,在开放进入市场之后持续成为行业热点,获得了游戏开发商的高度关注与参与.在 ...

  7. C程序

    /* 不适用C库函数,只是用 C 语言实现函数 void* memcpy( void *dst, const void *src, size_t len ) memmove 函数的功能是拷贝 src ...

  8. HashMap和Hashtable的同和不同(详细比较)

    一.综述 可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值.虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据h ...

  9. mssql sqlserver 下文分享一种新颖的字符串截取方法

    原文地址:http://www.maomao365.com/?p=7307 摘要:    以前分割字符串时,都使用类似split函数的方式处理,下文分享一种对有规律的字符串的分隔方式,    即:1. ...

  10. ASP.NET -- WebForm -- 页面生命周期

    ASP.NET -- WebForm --  页面生命周期 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件 ...