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的更多相关文章

  1. 【简说Python WEB】Flask应用的文件结构

    目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...

  2. python web框架Flask——csrf攻击

    CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...

  3. python web开发-flask中sqlalchemy的使用

    SqlAlchemy是一个python的ORM框架. 在flask中有一个flask-sqlalchemy的扩展,使用起来很方便. 1.       创建一个sqlalchemy的Model模块 创建 ...

  4. Python Web 之 Flask

    FLASK 一.概述 flask是一个基于python并依赖于Jinja2模板引擎和WerkZeug WSGI(Web Server Gatewey InterFace.web)服务的框架 WSGI: ...

  5. Python Web框架——Flask

    简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理 ...

  6. Python web框架 flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  7. python web框架Flask——后台登录

    项目搭建 创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件 1.在主目录下创建配置文件:config.py 2.在主目录下创建扩展文件:exts.py 3.在主目录 ...

  8. [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题

    ---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...

  9. python web开发-flask访问请求数据request

    Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...

随机推荐

  1. OKHttp和NumberProgressbar组建强大的Android版本更新功能

    你们看过韩国电影<奇怪的她>不?女主角是不是超级漂亮的.......好啦,扯正事吧,先看看女神照片. 公司新项目用到了OKHttp网络框架,在下载文件这块都蒙圈啦,再查查资料就一个Reso ...

  2. 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法

    目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...

  3. 06、自动挂载+超级守护进程+时间同步+tcpwrapper+软硬链接+日志管理

    autofs  自动挂载服务   把下面这两条命令做成自动挂载 172.16.2.35:/share/soft /nfs/soft 172.16.2.35:/share/iso  /nfs/iso . ...

  4. tf–idf算法解释及其python代码

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  5. HTTP协议之chunk,单页应用这样的动态页面,怎么获取Content-Length的办法

    当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面等时,服务器是不可能预先知 ...

  6. 积性函数与Dirichlet卷积

    转载自https://oi-wiki.org/math/mobius/ 积性函数 定义 若 $gcd(x,y)=1$ 且 $f(xy)=f(x)f(y)$,则 $f(n)$ 为积性函数. 性质 若 $ ...

  7. hdu2281&&POJ1320——Pell方程

    hdu2281 输入一个 $N$,求最大的 $n$($n \leq N$)和 $x$,使得 $x^2 = \frac{1^2+2^2+...+n^2}{n}$. 分析: 将右边式子的分子求和化简,有: ...

  8. Win10解决修改host没有权限问题(其他文件同理) 一步都不能少哦:先添加再授权

    Step1:右键文件选择属性,选择安全,点击编辑: Step2:在弹窗中点击添加,在弹窗中点击高级: Step3:在弹窗中点击立即查找,选中当前用户,点击确定: Step4:此时选中用户已经被加入进来 ...

  9. Pandas | 11 字符串函数

    在本章中,我们将使用基本系列/索引来讨论字符串操作.在随后的章节中,将学习如何将这些字符串函数应用于数据帧(DataFrame). Pandas提供了一组字符串函数,可以方便地对字符串数据进行操作. ...

  10. selenium--更改标签的属性值

    前戏 在进行web自动化的时候,我们有时需要获取元素的属性,有时需要添加,有时需要删除,这时候就要通过js来进行操作了 实战 from selenium import webdriver import ...