Flask 数据库集成的介绍
作者:tigeriaf 发布时间:2023-07-15 09:28:20
前言:
数据库是大多数 Web 应用的基础设施,只要想把数据存储下来,就离不开数据库,下面将一起学习一下如何给 Flask 应用添加数据库支持。
1、使用Flask-SQLAlchemy管理数据库
Flask-SQLAlchemy
集成了 SQLAlchemy
,它简化了连接数据库服务器、管理数据库及操作会话等各类工作,让 Flask
更方便的进行数据存储及处理,我们不必过多关心原生 SQL 语句,只需要使用 Python
类就可以轻松的完成对数据库表的增删改查操作,并且该插件还支持多种数据库类型,如MySQL
、PostgreSQL
、和SQLite
等。
我们可以使用pip install flask-sqlalchemy
进行安装。
1.1 配置Flask_SQLAlchemy
下面以 SQLite
数据库为例,Flask-SQLAlchemy
数据库的 url 通过配置变量SQLALCHEMY_DATABASE_URI
指定,通过 Flask-SQLAlchemy
提供的 SQLAlchemy
类传入 Flask 的实例 app,创建 db 实例,表示程序使用的数据库,这个 db 对象能够使用 Flask-SQLAlchemy
的所有功能。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
basedir = os.path.abspath(app.root_path)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
其中,SQLALCHEMY_TRACK_ MODIFICATIONS
配置变量表示是否追踪对象的修改,在此设为False
。
1.2 定义数据库模型
所谓数据模型,就是用来映射数据库表的 Python
类,一个数据模型类对应数据库中的一个表,类的属性代表数据库表的字段。所有的模型类都需要继承 Flask-SQLAlchemy
提供db.Model
基类。
新建model.py文件,定义User类如下:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_name = db.Column(db.String)
password = db.Column(db.String)
1.3 创建数据库和表
运行 Flask
应用,然后在终端中输入flask shell
命令,进入 Python
交互环境
如下所示:
>>> from app import db # 从app.py中导入db实例
>>> from model import * # 从model.py中导入所有模型类
>>> db.create_all() # 用db.create_all()创建数据库表
执行完之后,会在项目根目录生成一个data.db
库文件。 注意: 数据库和表一旦创建后,之后对模型类的改动不会自动作用到实际的表中,比如,在模型类中添加或删除字段,修改字段的名称和类型,再次调用db.create_all()
不会重新创建表或是更新表,只有通过db.drop_all()
删除数据库中所有的表之后再调用db.create_all()
才能重新创建表,
那么就会出现这么一个问题:
这样操作的话,数据库表被删除重建了,那表中原有的数据也都没有了,这肯定是不行的,这时就出现了数据库迁移的概念,先留个坑,下篇文章介绍。
1.4 数据库操作
现在我们创建了模型,也生成了数据库和表,接下来就来学习一下常用的数据库操作。数据库操作主要是CRUD
(Create
创建、Read
读取/查询、 Update
更新、Delete
删除)。
1.4.1 Create
添加一条记录到数据库中,主要分为以下三步:
使用
Python
模型类创建对象作为一条记录添加新创建的对象到数据库会话中
提交数据库会话
如下,在上面的交互环境下,创建一个新用户:
>>> from app import db # 从app.py中导入db实例
>>> from model import User # 导入模型类User
>>> user1=User(user_name='tigeriaf', password='123456') # 创建用户1
>>> user2=User(user_name='admin', password='123456') # 创建用户2
# 添加新创建的对象到数据库会话中
>>> db.session.add(user1)
>>> db.session.add(user2)
# 将数据库会话提交,数据写入data.db文件
>>> db.session.commit()
# 测试
>>> print(user1.id)
1
>>> print(user2.id)
2
另外,除了依次调用add()
方法添加记录,也可以使用add_all()
一次添加包含多个模型类对象的列表。
1.4.2 Read
使用模型类
提供的 query
属性 通过模型类提供的 query
属性附加调用各种过滤方法可以查询数据库表的数据,
查询模式如下:
<模型类>.query.<过滤方法>.<查询方法>
从某个模型类出发,通过在 query
属性对应的 Query
对象上附加的过滤方法和查询函数对模型类对应的表中的记 进行各种筛选等,最终返回包含对应数据库记录数据的模型类实例,对返回的实例调用属性即可获取对应的字段数据。
# 查询全部
>>> User.query.all()
[<User 1>, <User 2>]
# 查询指定id的记录
>>> user1=User.query.get(1)
>>> user1.user_name
'tigeriaf'
# 查询条数
>>> User.query.count()
2
# 查询user_name为admin的用户
>>> User.query.filter_by(user_name='admin').all()
[<User 2>]
SQLAlcherny
提供了很多过滤方法,使用这些过滤方法可以获取更精确的查询,这里就不展开了。 完整的查询、过滤方法可以查看:The Query Object
。
1.4.3 Update
更新一条记录非常简单,直接给模型类的属性附上新的值,然后调用commit()
方法提交会话即可。 如下,修改 id
为 2
的用户的用户名 user_name
。
>>> user2=User.query.get(2)
>>> user2.user_name
'admin'
>>> user2.user_name='张三'
>>> db.session.commit()
>>> user2.user_name
'张三'
1.4.4 Delete
使用delete()进行数据记录的删除,如下:
>>> db.session.delete(user2)
>>> db.session.commit()
>>> user2=User.query.get(2)
>>> print(user2)
None
1.4.5 在视图函数里操作数据库
在视图函数里操作数据库的方式在 Python Shell
交互环境下大致是相同的,无非就是多了从请求对象获取数据及验证数据的步骤,
如下一个案例:
@app.route('/user', methods=['GET', 'POST'])
def user():
if request.method == 'POST':
user_name = request.form['user_name']
password = request.form['password']
user = User(user_name=user_name, password=password)
db.session.add(user)
db.session.commit()
return 'user:{} add success! id:{}'.format(user_name, user.id)
else:
user_id = request.args.get('user_id')
user = User.query.get(user_id)
if user:
return 'Hello user:{}!'.format(user.user_name)
else:
return 'failed'
上述代码中,视图函数 user
接受两种方式的请求,分别完成添加用户、查询用户的功能,将接收数据存储在数据库中。
发送请求测试如下:
来源:https://juejin.cn/post/7031700120924405773
猜你喜欢
- [编者注:]提起数据库,第一个想到的公司,一般都会是Oracle(即甲骨文公司)。Oracle在数据库领域一直处于领先地位。Oracle关系
- 扪心自问,你真正了解你卖给用户的是什么玩意么?你所认为革命性的,一定会震惊世界的功能、特色,用户真的买单么?我的意思是,我们总是习惯性的忘记
- 本文介绍 SQL Server 2000 企业版的新功能 - 索引视图。讲解索引视图并讨论一些提高性能的具体方案。什么是索引视图?许多年来,
- 实现代码/// <summary>/// 去除HTML标记/// </summary&
- 1、元旦之前受赵晨之邀作为讨论嘉宾参加了ACM组织的“人与信息社会巡讲”。2、去之前赵晨发给了我大致的讨论提纲。咣当了好几下~说实话,我是硬
- 最近在做新闻发布系统的时候,用到了二级联动,我把使用方法记录下来,以便日后查阅以及帮助新手朋友们。下面是效果图:下面来讲解一下实现的方法:1
- 1.ACCESS查询(query_info):select * from info where stu = name1 and age =
- 同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂!概述首先主服务器把数据变化记录到主日志,然后从服务
- 近日因为升级系统的需要,将旧mysql数据库从3.23升级到5.0.41先从mysql3.23中mysqldump出数据文件data.sql
- 见下:<form action="./calculation.asp"><input&nbs
- 第一步肯定是打上SQL SERVER最新的安全补丁.如果这一步都没有做好,那我们也没有继续下去的必要了。 第二步是修改默认的1433端口,并
- 很多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当。相对来说,将数据装入数据库是直截了当的
- 平时在写asp代码的时候有很多重复的内容要写,麻烦的要命,比如在收集表单提交的数据时,特别是表单的输入域比较多时,要不断写好多的reques
- 就我个人经验来讲:除了oracle,没有比HP 客户支持中心更糟糕的体验了。刚买不到一个月的HP MINI笔记本,莫名其妙键盘上的引号键松动
- 最近做了一次口碑网注册流程改造,简单说一下激活邮件的设计上的一些小心得:1、尽量不要用图片,尤其是别把激活链接做成一个点击按钮。2、尽量少的
- 当用户关闭cookie时,通过asp程序提示访客打开,源代码如下: Dim strCookie, strT
- 此前piscdong已经做过一次评测了,这次的Beta正式推出,我也来参与一下.当回小白鼠吧.新的界面设计非常让人兴奋750){this.r
- 阅读上一篇:FrontPage XP设计教程3——网页的布局 FrontPage XP可以保证用户设计网页与不同的浏览器兼容,它所提供的样式
- 今天看到某人博客推荐了http://dragoninteractive.com/这个网站,貌似一些效果做的比较不错,于是打开了看看,不过还真
- 如何制作一个弹出式的调查窗口?执行下面这段ASP代码: <% &n