先进行如下操作:

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. WORLD 快速线

    1,3个“-”     一条直线 2,3个“=”    一条双直线 3,3个“*”     一条虚线 4,3个“~”     一条波浪线 5, 3个“#”    一条隔行线

  2. 远程连接centos7 上的mysql报(ERROR 2003 (HY000): Can't connect to MySQL server on '168.x.x.x' (10060) )

    1.MySQL端口 因为上一篇文章我就已经给MySQL新建了一新用户,且赋予了远程连接数据库的所有权限(GRANT ALL PRIVILEGES ON *.* TO 'newuser' @ '%' I ...

  3. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  4. Shell中判断语句if中-z至-d的意思

    [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ ...

  5. ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题

    在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或.GridView来实现, 是在使用的过程总又遇到了一个新的问题,就是如果在ScrollView ...

  6. github上传流程图记录

    参考文章 http://blog.csdn.net/laozitianxia/article/details/50682100 首先你得先创建仓库 为仓库取一个名字,然后点击创建就会有一个仓库了, g ...

  7. php post接口,登录功能

    登录功能同注册功能一样,都是使用 post 方法,在执行 sql 语句时,同样要使用 "select * from 表名 where 键名 = 参数" 的查询方式,不同的是: 注册 ...

  8. .svn文件夹特别大

    一个项目通过svn管理,迭代开发一年之后,.svn目录达到20G或更大,对于SSD硬盘来说是非常占用空间的,经过我的尝试,可以使用tortoiseSVN自带的cleanup为文件夹瘦身. 操作方法: ...

  9. tesseract-ocr安装问题

    今天安装tesseract-ocr的时候,载了坑,记录一下. 1. 安装时语言库的选择,我把 aditional language data 这一项全选中了,装的时候那叫一个慢啊,差不多3个小时装好的 ...

  10. CVE-2017-8464 分析

    目录 CVE-2017-8464(stuxnet 3.0) 分析 0xFF 前言 0x00 分析工具 0x01 漏洞复现 1).生成一个DLL用于测试 2).构造一个恶意的lnk二进制文件 3).RU ...