为什么不使用SQL语句,而使用ORM框架管理数据库?首先,在python程序中嵌入原生SQL语句,不方便维护,ORM框架使用面向对象思想,使用较方便;第二,如果更换底层数据库引擎,ORM框架不需要修改代码。ORM框架也有其弊端,如有一定的性能损耗,且高级查询编写复杂,有一定的学习成本。

1、配置数据库链接

Flask-SQLAlchemy 中,数据库使用 URL 指定。一般开发环境使用SQLite,生产环境使用MySQL,使用MySQL时,还需要再安装相应的依赖包。

几种最流行的数据库引擎使用的 URL 格式:

数据库引擎 URL
MySQL mysql://username:password@hostname/database
SQLite(Linux,macOS) sqlite:////absolute/path/to/database
SQLite(Windows) sqlite:///c:/absolute/path/to/database

配置数据库:

app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app) # SQLALCHEMY_TRACK_MODIFICATIONS 参数决定是否追踪对象的修改,SQLAlchemy建议配置此变量,不然会有警告。

2、定义模型

模型这个术语表示应用使用的持久化实体。在ORM中,模型一般是一个表示数据表的类,类的实例对应一条记录,类中的属性对应于数据库表中的列。

所以模型定义,类似原生SQL的CREATE TABLE语句:

class Role(db.Model):
# 定义表名
__tablename__ = 'roles' # 定义字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True) def __repr__(self):
return '<Role %r>' % self.name

常用列类型与列选项:https://www.cnblogs.com/adamans/articles/9815040.html

3、关系

关系型数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。在关系型数据库中,关系是通过主键和外键来维护,其中外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证,这里讨论使用数据库来约束的情况。

3.1 一对多

例如角色和用户是一对多关系,一个用户只对用一个角色,而一个角色可以对应多个用户:

class Role(db.Model):
# ...
users = db.relationship('User', backref='role') class User(db.Model):
# ...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

添加到 User 模型中的 role_id 列被定义为外键,就是这个外键建立起了关系。传给 db.ForeignKey() 的参数 'roles.id' 表明,这列的值是 roles 表中相应行的 id值。

添加到 Role 模型中的 users 属性代表这个关系的面向对象视角,对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列表。db.relationship() 的第一个参数表明这个关系的另一端是哪个模型,backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。通过 User 实例的这个属性可以获取对应的 Role 模型对象,而不用再通过 role_id 外键获取。

3.2 一对一

一对一关系可以用前面介绍的一对多关系表示,但调用 db.relationship() 时要把 uselist 属性设为 False,把“多”变成“一”。

3.3 多对一

多对一关系从“多”这一侧看,就是一对多关系,对调两个表即可。

3.4 多对多

上述关系至少都有一侧是单个实体,所以记录之间的联系通过外键实现,让外键指向那个实体。但是,可能两侧都是“多”的关系,如有学生表和课程表,学生可能选多个课程,课程也可能被多个学生选。这种时候一般使用第三张表(即关联表)来表示关系:

class c(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
classes = db.relationship('Class',
secondary=registrations,
backref=db.backref('students', lazy='dynamic'),
lazy='dynamic') class Class(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String) registrations = db.Table('registrations',
db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
db.Column('class_id', db.Integer, db.ForeignKey('classes.id'))
)

多对多关系仍使用定义一对多关系的 db.relationship()方法定义,但在多对多关系中,必须把 secondary 参数设为关联表。多对多关系可以在任何一个类中定义,backref参数会处理好关系的另一侧。关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表。

Studentclasses 关系使用列表语义,这样处理多对多关系特别简单:

# 查看Student实例所选课程、Class实例被选情况
>>> s.classes.all()
>>> c.students.all() # 增加课程
>>> s.classes.append(c)
>>> db.session.add(s)
>>> db.session.commit() # 取消选课
>>> s.classes.remove(c)
>>> db.session.add(c)
>>> db.session.commit()

关联表使用db.Table类定义

指定了lazy='dynamic' 参数,所以关系两侧返回的查询都可接受额外的过滤器

3.5 自引用

多对多有种特殊情况,即关系中的两侧都在同一个表中,这种关系称为自引用关系。如用户表之间的关注关系,

4、数据库操作

对数据库的改动通过数据库会话管理,在 Flask-SQLAlchemy 中,数据库会话由 db.session 表示。调用 db.session.commit()提交事务,db.session.rollback() 回滚事务。

创建表、删除表

db.create_all()
db.drop_all()

CREATE

admin_role = Role(name='Admin')
db.session.add(admin_role)
db.session.add_all([admin_role, mod_role])
db.session.commit()

UPDATE

admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.commit()

DELETE

db.session.delete(mod_role)
db.session.commit()

READ

<模型类>.query.<过滤方法>.<查询方法>

User.query.all()
User.query.filter_by(role=user_role).all()
Role.query.filter_by(name='User').first()
# 查看查询API...

5、文档

sqlalchemy中文文档:https://www.osgeo.cn/sqlalchemy/

sqlalchemy英文文档:https://docs.sqlalchemy.org/

flask-sqlalchemy文档:http://www.pythondoc.com/flask-sqlalchemy/index.html

Flask:数据库管理的更多相关文章

  1. python+mysql+flask创建一个微博应用(持续更新)

    微博应用的结构: 用户管理,包括登录管理,会话,用户角色,个人档案及用户头像. 数据库管理,包括数据库迁移处理. Web表单支持,包括字段检验和用于防止垃圾邮件的验证码功能. 大数据的分页功能. 全文 ...

  2. 狗书无敌,天下第一(flask基础)

    为什么选择使用flask? 和其他框架相比, Flask 之所以能脱颖而出,原因在于它让开发者做主,使其能对程序具有全面的创意控制. 在 Flask 中,你可以自主选择程序的组件,如果找不到合适的,还 ...

  3. flask 面试题

    1,什么是Flask,有什么优点?概念解释Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序可以是一些Web页面,博客,wiki,基于Web的日里 ...

  4. [Python]Python入坑小项目推荐- Flask example minitwit

    知乎上看到的Python练手项目推荐,链接见:https://www.zhihu.com/question/29372574,不知道是我自己懒得看还是理解力不行,这些项目真的是...太大了呀~~~~ ...

  5. Flask关于请求表单的粗浅应用及理解+简单SQL语句温习

    1.请求表单 请求表单的知识点是flask数据请求中很小的一部分,首先要了解一下GET和POST请求:http://www.w3school.com.cn/tags/html_ref_httpmeth ...

  6. Python的Flask框架与数据库连接的教程

     命令行方式运行Python脚本 在这个章节中,我们将写一些简单的数据库管理脚本.在此之前让我们来复习一下如何通过命令行方式执行Python脚本. 如果Linux 或者OS X的操作系统,需要有执行脚 ...

  7. django和flask的区别

    转载至https://blog.csdn.net/tulan_xiaoxin/article/details/79132214 (1)Flask Flask确实很“轻”,不愧是Micro Framew ...

  8. pthon web框架flask(一)

    pthon web框架优劣: 知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,原因是: Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.p ...

  9. 详说Flask、Django、Pyramid三大主流 Web 框架

    前言 目前随着 Python 在大数据.云计算.人工智能方面的热度,Python Web 应该也会被更多企业了解使用. Python Web 框架千万种,没必要都去了解和学习,身边总有人说高手都用 F ...

随机推荐

  1. CF-1451 E Bitwise Queries 异或 交互题

    E - Bitwise Queries 传送门 题意 有一组序列,长度为 \(n(4\le n \le 2^{16})\),且 \(n\) 为 2 的整数次幂,序列中数值范围为 [0,n-1], 每次 ...

  2. P3128 [USACO15DEC]最大流Max Flow (树上差分)

    题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...

  3. centos7.2安装图形化界面 && 在Linux上更改当前默认界面

    安装环境 [root@desktop-test ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 安装过程 [root@ ...

  4. Codeforces ECR86 C. Yet Another Counting Problem(规律,区间)

    题意:给你两个正整数a和b,询问q次,每次给你一个区间[l,r],问[l,r]中有多少数字满足:x%a%b!=a%b%a. 题解:看公式无从下手的题,一般都是要找规律的.首先,我们知道,假如x%a%b ...

  5. Linux系统编程【3.1】——编写ls命令

    ls命令简介 老规矩,直接在终端输入:man ls (有关于man命令的简介可以参考笔者前期博客:Linux系统编程[1]--编写more命令) 可以看到,ls命令的作用是显示目录中的文件名,它带有可 ...

  6. 常用SQL语句1-增删改查

    一.名词解释 RDBMS 即关系数据库管理系统(Relational Database Management System)的特点: 1.数据以表格的形式出现 2.每行为各种记录名称 3.每列为记录名 ...

  7. 卧槽,sql注入竟然把我们的系统搞挂了

    前言 最近我在整理安全漏洞相关问题,准备在公司做一次分享.恰好,这段时间团队发现了一个sql注入漏洞:在一个公共的分页功能中,排序字段作为入参,前端页面可以自定义.在分页sql的mybatis map ...

  8. μC/OS-III---I笔记10---内存管理

    内存管理: 平时经常用到一些windows内存管理的软件,有一些内存管理的软件进行内存碎片的整理,在频繁分配和释放内存的地方会造成大量的内存碎片.内存碎片是如何形成的呢?书中是这样写的:在不断的分配和 ...

  9. 云原生系列3 pod核心字段

    pod是容器化的基础,好比大楼的地基. Pod跟容器的关系 类比一下: POD: 物理机容器: 物理机上的一个进程: 容器只是Pod的一个普通字段. Pod的作用范围 跟容器的linux namesp ...

  10. fibonacci all in one

    fibonacci all in one fibonacci sequence https://www.mathsisfun.com/numbers/fibonacci-sequence.html f ...