在 Flask Web 框架中,Flask-SQLALchemy 扩展对数据库操作进行了封装,使用 Flask-SQLALchemy ,可以通过 Python 对象来操作数据库。
一、Flask-SQLALchemy 简介
Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。它需要 SQLAlchemy 0.6 或更高的版本。它致力于简化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默认值和额外的助手来更简单地完成日常任务。
上面这句话引自 Flask-SQLALchemy 的中文文档: http://docs.jinkan.org/docs/flask-sqlalchemy/ 。
SQLALchemy 对数据库进行了抽象,通过 Python 对象来操作数据库,开发者不用直接和 SQL 语句打交道。这会让我们想起 ORM(Object-Relational Mapping,对象关系映射),Flask-SQLALchemy 就是一个满足 ORM 的 Flask 框架。
关于 ORM 可以参考: Web框架中的ORM框架
SQLAlchemy 是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库操作,也就是说,SQLAlchemy 是满足 ORM 的框架。而 Flask-SQLALchemy 是一个简化了 SQLAlchemy 操作的 Flask 扩展。
Flask-SQLALchemy 实现了关系数据库和 Python 对象的映射,舍弃了一些性能开销,换取了较大的开发效率提升和开发人员的便利。
二、Flask-SQLALchemy 安装
使用命令 pip install flask-sqlalchemy 安装 Flask-SQLALchemy,如果用的是 pip3 ,就使用 pip3 install flask-sqlalchemy。
pip install flask-sqlalchemy
pip3 install flask-sqlalchemy
一般来说在 Linux 上安装都会很顺利,在 Windows 上安装可能会有防火墙的原因,下包时会连接超时,可以先将包下载到本地再进行安装。
python setup.py install flask-sqlalchemy
也可以指定国内的镜像源来安装,如清华的源 https://pypi.tuna.tsinghua.edu.cn/simple ,阿里的源http://mirrors.aliyun.com/pypi/simple/ 。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask-sqlalchemy
当提示下图的结果时,安装成功。
如果使用 mysql 数据库,还需要安装 mysqldb 驱动。
pip install flask-mysqldb
在 Linux 中,如果是缺少 gcc 等原因,可以安装对应的工具来解决。如:
yum install -y gcc
yum install -y libffi-devel python-devel openssl-devel
如果已经安装了 python-devel 还找不到 Python.h ,可能是同时安装了不同版本的 Python,可以到 /usr/include/ 下不同 Python 版本的文件夹中看 Python.h 在哪个目录下,如果在 Python2 中,就用 pip2 安装,如果在 Python3 中,就用 pip3 安装,只是 pip2 是安装到 Python2 中,pip3 是安装到 Python3 中,看是否满足自己的目的。
在 Windows 中通过指定国内镜像源来进行安装。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask-mysqldb
每个人的环境不同,安装过程中的问题也各不相同,需要灵活解决,自己搜索找一些方法。
当提示下图的结果时,安装成功。
三、Flask-SQLALchemy 连接数据库
1. 先创建一个数据库
这里使用我之前创建的 admin 用户连接数据库。
mysql -u admin -p
回车后输入密码连接数据库,创建一个数据库来使用,我这里也是使用之前创建过的数据库 MyDB_one ,如果没有就创建。
create database MyDB_one charset utf8;
2. 在 Flask 代码中连接数据库
在 Flask-SQLAlchemy 中,与数据库的连接方式是在 Flask 对象的配置中加入 SQLALCHEMY_DATABASE_URI 配置项,配置项的值是一个 URL 的形式,‘mysql://user:password@ip:port/database’ ,分别是使用的数据库,登录用户,密码,ip地址,端口,数据库名。如:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://admin:Mysql!123@127.0.0.1:3306/MyDB_one'
这样配置之后,Flask 就会连接到对应的数据库。
3. 数据库连接设置
设置 SQLALCHEMY_TRACK_MODIFICATIONS 为 True 动态追踪修改设置,如未设置会提示警告。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
设置 SQLALCHEMY_ECHO 为 True ,查询时会显示原始SQL语句。
app.config['SQLALCHEMY_ECHO'] = True
除了这两个常用的配置,还可以根据需要设置其他的数据库连接设置,可以自己查询一下,这里就不扩展了。
4. 创建 SQLAlchemy 对象
将 Flask app 对象传递给 Flask-SQLAlchemy 中导入的 SQLAlchemy 类,创建一个 SQLAlchemy 对象 db ,这个对象名是自定义的,叫 db 是为了方便理解。
在后面的代码中,使用 db 来创建数据表和创建表的字段。
5. 定义数据模型类
自定义一个数据对象的类,这个类的名字一般和数据库中的表名同名。
这个数据库必须继承 db 对象的 Model 类。
在类中通过 __tablename__ 来指定表名,通过 db 对象的 Column 方法来定义数据库的字段,通过 db 对象中的字段类型来定义数据库的字段类型。
6. 执行数据表创建
定义完成数据模型类后,执行 db 对象的 create_all() 方法,运行 Flask 后端程序后,就会在连接的数据库中创建一张表。
四、Flask-SQLALchemy 使用
在项目目录下创建一个 flask_alchemy.py 文件,注意,文件名不能叫 flask_sqlalchemy.py ,那样会与 Flask-SQLAlchemy 库中的文件名相同,会造成导包错误。
创建完成后,在 flask_alchemy.py 中编写代码。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://admin:Mysql!123@127.0.0.1:3306/MyDB_one'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
class Computer(db.Model):
__tablename__ = 'Computer_table'
cid = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
price = db.Column(db.Integer)
db.create_all()
if __name__ == '__main__':
app.run(debug=True)
运行代码后,会在数据库 MyDB_one 中创建一张叫 Computer_table 的数据表,表中有三个字段 cid , name , price 。
这说明我们成功通过 Flask-SQLAlchemy 实现了在 Flask 项目中操作数据库,实现了 ORM 操作。后面要对数据表进行增删改查,都可以通过定义的模型类 Computer 的对象来进行。