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的最后一章了,用于初 ...
随机推荐
- check约束
-- 删除表 drop table check_test; -- 不为空,不为null的值只能是0,1(不为空,值只能是0,1) create table check_test( default_fl ...
- SQL 读取XML到Datatable
DECLARE @hdoc INT --XML 数据格式 --------------------------------------------------------- ) SET @doc = ...
- CSS效果:CSS改变下拉列表select框的默认样式
原理 原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可.当然右侧的小箭头可以用伪元素before或者after来实现. select { /*Chrome和Fir ...
- Python 多线程并发程序设计与分析
多线程并发程序设计与分析 by:授客 QQ:1033553122 1.技术难点分析与总结 难点1:线程运行时,运行顺序不固定 难点2:同一段代码,再不加锁的情况下,可能被多个线程同时执行,这会造成很多 ...
- IE打开https网站时,取消证书问题提示
上面介绍了,调用IE来打开对应的网页问题,但是在实际测试中,有些网站是采用https协议的,这时候IE浏览器会弹出如下窗口,一般手动选择后,才可进入登录界面,那么该如何解决呢? 1.点击[继续浏览此网 ...
- (后端)springboot 在idea中实现热部署(转)
自己用到了iIntelliJ IDEA 这个ide工具,但是和以前的工具写html,css,js直接刷新页面不同,这个需要去热部署,网上搜的解决方法: SpringBoot的web项目,在每一次修改了 ...
- (后端)Sql Server日期查询-SQL查询今天、昨天、7天内、30天(转)
今天的所有数据: 昨天的所有数据: 7天内的所有数据: 30天内的所有数据: 本月的所有数据: 本年的所有数据: 查询今天是今年的第几天: select datepart(dayofyear,getD ...
- (网页)html中页面传递参数不用cookie不用缓存,js方法搞定
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- 使用Visual Studio Team Services敏捷规划和项目组合管理(七)——流程定制
使用Visual Studio Team Services敏捷规划和项目组合管理(七)--流程定制 在Team Services中,可以通过流程定制工作追踪体验.流程定义了工作项跟踪系统的构建部分,以 ...
- SQL server 导出平面文件时出错: The code page on Destination - 3_txt.Inputs[Flat File Destination Input].Columns[UserId] is 936 and is required to be 1252.
我在导出平面文件时:Error 0xc00470d4: Data Flow Task 1: The code page on Destination - 3_txt.Inputs[Flat File ...