flask-sqlalchemy 一对一,一对多,多对多操作
先进行如下操作:
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 一对一,一对多,多对多操作的更多相关文章
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- DjangoORM一对多&多对多操作
简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 st ...
- Django一对多,多对多操作
简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
随机推荐
- Ansible playbook roles
1 概述 角色(roles):如果我们使用playbook写成一个文件,这个文件会很大,但是不方便组织,我们可以分组,把playbook根据功能,如handler,tasks等分门别类的放在在各自的 ...
- CSS样式—— 字体、元素的垂直水平居中
1.CSS样式与HTML中标签属性的区别: 标签的属性是采用 属性名=“属性值” 表示的 CSS样式是采用名值对 属性名:属性值: 表示的 2.内联元素(行内元素)与块元素 (1)内联元素及其特点: ...
- 性能测试 CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据
CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据 by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 2 1.安装influxdb ...
- MySQL 横向表分区之RANGE分区小结
MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...
- Android 7.0 新特性
Android7.0提供新功能以提升性能.生产效率和安全性. 关于Android N的性能改进,Android N建立了先进的图形处理Vulkan系统,能少的减少对CPU的占用.与此同时,Androi ...
- 腾讯云 Game-Tech 技术沙龙小游戏专场“空降”长沙
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 小游戏作为今年快速成长的新生态,在开放进入市场之后持续成为行业热点,获得了游戏开发商的高度关注与参与.在 ...
- C程序
/* 不适用C库函数,只是用 C 语言实现函数 void* memcpy( void *dst, const void *src, size_t len ) memmove 函数的功能是拷贝 src ...
- HashMap和Hashtable的同和不同(详细比较)
一.综述 可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值.虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据h ...
- mssql sqlserver 下文分享一种新颖的字符串截取方法
原文地址:http://www.maomao365.com/?p=7307 摘要: 以前分割字符串时,都使用类似split函数的方式处理,下文分享一种对有规律的字符串的分隔方式, 即:1. ...
- ASP.NET -- WebForm -- 页面生命周期
ASP.NET -- WebForm -- 页面生命周期 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件 ...