Python Web 之 Flask SQLalchemy
Flask-SQLalchemy
一、 一对多
A表中的一条记录与B表中的多天记录关联
语法实现:
在“多”实体类中增加
外键列名 = db.Column(db.Integer, db.ForeignKey(主表.主键))在“一”实体中增加反向引用关系
属性名=db.creationship("多的实体类名", 关系选项, lazy="dynamic")属性名=db.creationship("多的实体类名", backref="属性名", lazy="dynamic")
选项名 说明 backref在关系的另一个模型中添加反向引用 lazy指定如何加载相关记录( select:首次加载时访问;immediate:源对象加载之后马上就加载关联数据;subquery:立即加载,但是使用子查询;noload:永不加载;dynamic:不加载记录,单提供加载记录的查询)· selist如果设置为True,则不适用列表,使用标量 secondary指定多堆垛关系中关联表的名字
新建两张表,分别是teacher和course,使用外键course_id和course表中的id关联
teacher为一、course为多
1. 建表
class Teacher(db.Model):
__tablename_ = "teacher"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
tname = db.Column(db.String(30), nullable=False)
tage = db.Column(db.Integer)
#增加一列,引用主键的id,外键列,引用主键表(course)的主键列
course_id = db.Column(db.Integer, db.ForeignKey('course.id'))
def __init__(self, tname, tage):
self.tname = tname
self.tage = tage
def __repr__(self):
return "<Teacher: 教师姓名(%r) 年龄(%r)>"%(self.tname, self.tage)
class Course(db.Model):
__tablename__ = "course"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
cname = db.Column(db.String(30), nullable=False)
# 反向引用:返回与当前课程相关的teacher列表
#backref :定义反向关系,本质上回向teacher的实体中增加一个course属性,该属性可替代curse_id来访问Course,此时获得到的是模型对象,而不是外键值
teachers = db.relationship("Teacher", backref='course', lazy="dynamic")
def __init__(self, cname):
self.cname = cname
def __repr__(self):
return "<Course: 课程名(%r)>"%self.cname
2. 增加数据
法一
teacher = Teacher("苍老师", 37)
teacher.course_id = 1
db.session.add(teacher)
法二:根据course_id查询出一个Course实体,再将Course实体赋值给teacher
teacher = Teacher("苍老师", 37)
course = Course.query.filter_by(id=1).first()
teacher.course = course
db.session.add(teacher)
3. 查询数据
法一(多查一)
# 双向查询,通过course查teacher,通过teacher查course
#通过course查询所有的teacher
course = Course.query.filter_by(id=1).first()
#根据course对象查询所由的teacher对象
teachers = course.teachers.all()
print(teachers)
法二(一查多)
teacher = Teacher.query.filter_by(tname="波老师").first()
course = teacher.course
print("教师:%s , 课程:%s"%(teacher.tname, course.cname))
发三(原生查询)
results = db.session.query(Teacher, Course).filter(Teacher.course_id == Course.id).all()
for result in results:
print(result.Teacher.tname, result.Course.cname)
二、 一对一
A表中的一条记录只能与B表中的一条记录关联
B表中的一条记录只能与A表中的一条记录关联
1. 语法
2. 建表
class Man(db.Model):
__tablename__ = "man"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
mname = db.Column(db.String(30))
mage = db.Column(db.Integer)
#增加反向引用,与Woman实体类一对一引用允许在Man中得到一个Woman的信息,同时,在Woman中也能得到一个man信息
woman = db.relationship("Woman", backref="man", uselist=False)
def __init__(self, mname, mage):
self.mname = mname
self.mage = mage
def __repr__(self):
return "<Man:%r %r>"%(self.mname, self.mage)
class Woman(db.Model):
__tablename__ = "woman"
id = db.Column(db.Integer, primary_key=True)
wname = db.Column(db.String(30))
wage = db.Column(db.Integer)
#增加一个列,表示引用自man表的主键
man_id = db.Column(db.Integer, db.ForeignKey("man.id"))
def __init__(self, wname, wage):
self.wname = wname
self.wage = wage
def __repr__(self):
return "<Woman:%r %r>"%(self.wname, self.wage)
3. 插入
#查询王老师信息
wang = Man.query.filter_by(mname="王老师").first()
#创建wife对象
wife = Woman("王夫人", 16)
#将王老师对象赋值给wife
wife.man = wang
#将wife保存
db.session.add(wife)
return "OK"
4. 查询
#通过man找woman
man = Man.query.filter_by(mname="王老师").first()
woman = man.woman
print(man.mname, woman.wname)
return "OK"
#通过woman找man
wife = Woman.query.filter_by(wname="王夫人").first()
man = wife.man
print(wife.wname, man.mname)
三、多对多
1. 实现
增加关联属性以及反向引用
course=db.relationship("course", secondary="student_course", lazy="dynamic", backref=db.backref("student", lazy="dynamic"))
Python Web 之 Flask SQLalchemy的更多相关文章
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- python web框架Flask——csrf攻击
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- python web开发-flask中sqlalchemy的使用
SqlAlchemy是一个python的ORM框架. 在flask中有一个flask-sqlalchemy的扩展,使用起来很方便. 1. 创建一个sqlalchemy的Model模块 创建 ...
- Python Web 之 Flask
FLASK 一.概述 flask是一个基于python并依赖于Jinja2模板引擎和WerkZeug WSGI(Web Server Gatewey InterFace.web)服务的框架 WSGI: ...
- Python Web框架——Flask
简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理 ...
- Python web框架 flask
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- python web框架Flask——后台登录
项目搭建 创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件 1.在主目录下创建配置文件:config.py 2.在主目录下创建扩展文件:exts.py 3.在主目录 ...
- [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题
---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...
- python web开发-flask访问请求数据request
Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...
随机推荐
- NIO的整体认识
目录 1.Java NIO简介 2.java NIO和IO的主要区别 3.缓冲区buffer和通道channel 3.1.缓冲区buffer 3.2.channel 4.文件通道fileChannel ...
- Mysql-MariaDB设置延迟同步
CHANGE MASTER TO MASTER_DELAY = N; N为秒数
- k8s dashboard 解决secret自建证书导致浏览器访问限制
解决参考: https://www.jianshu.com/p/c6d560d12d50 熟悉dashboard yaml文件所创建的资源 wget https://raw.githubuserc ...
- Zabbix监控多个JVM进程
一.场景说明: 我们这边的环境用的是微服务,每个程序都是有单独的进程及单独的端口号,但用jps查询出来的结果有些还会有重名的情况,所以某些脚本不太适用本场景: 二.需求说明: 需使用Zabbix- ...
- 八、collection系列-----计数器、有序字典、默认字典、可命名元组、双向队列、单向队列一.计数器(对字典的扩展)
一.计数器(对字典的扩展) 有如下一个字典: dic = {'k1':123,'k2':123,'k3':12} 统计12出现的次数,123出现的次数 1.统计出现次数 >>> ...
- 【Tomcat】安装Tomcat服务器&Tomcat的目录结构
创建时间:6.14 一.安装Tomcat服务器 Tomcat下载ver8的,现在用的多 下载并解压 配置环境变量:(切记!!不然startup那步会闪退) 1.新建系统环境变量: (1)进入根目录,复 ...
- Python基础之输出格式和If判断
格式化输出的三种方式 一.占位符 #占位符 name = 'nick' age = 19 print('my name is %s my age is %s' % (name, age)) age = ...
- ORM基本增删改查
将上一节建造好的数据库 引入Navicate copy_path找到数据表路径 再用navicat打开 创建好的db不只一张表,其中第一张是我们创建的可以用的表 ,其他都是django自带功能所需表 ...
- React的使用小规范----长期更新
用this.state控制组件显示,用this.props控制页面业务数据,用this.other保存其他需要的属性,如计时器setInterval的id
- org.apache.hadoop.util.Shell demo/例子
package cn.shell; import java.io.IOException; import org.apache.hadoop.util.Shell; public class Shel ...