目录
1 背景
Flask 没有自带的 ORM 框架,但有一个与 Flask 亲和性较好的 ORM 第三方模块 flask_sqlalchemy
2 使用
2.1 安装
pip install flask_sqlalchemy
2.2 样例代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@127.0.0.1:3306/tp?charset=utf8"
app.config['SQLALCHEMY_ECHO'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
db.create_all()
2.3 代码解析
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@127.0.0.1:3306/tp?charset=utf8" [ mysql 指定什么类型的数据库,如果为 oracle 数据库,则为 oralce; tp 为 database 名称 ]
app.config['SQLALCHEMY_ECHO'] = True [ 在操作数据库时,将 sql 打印出来 ]
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False [ 是否跟踪数据库的修改情况,建议 False ]
db = SQLAlchemy(app) [ 实例化 ORM 框架的操作对象,后续数据库操作,都要使用该操作对象来完成 ]
db.create_all() [ 根据 TestCaseModel.py 在 db 创建所有表结构,但是 如果 在 Model.py 增加了一个 字段,即使再次执行一遍 db.create_all() 也不会更新 db 中的 表结构,如果有这种需求需要 使用 第三方模块 flask-migrate、flask-script ]
2.4 常见问题
2.4.1 sqlalchemy.exc.ArgumentError: Mapper mapped class TestCase->test_case could not assemble any primary key columns for mapped table 'test_case'
一个表如果没有自增的 id 作为 pk 就会报这个错。
id = db.Column(db.Integer, autoincrement=True, primary_key=True, nullable=False)
2.4.2 在 通过 db.create_all() 根据 TestCaseModel.py 创建 数据库表结构时,报错ModuleNotFoundError: No module named 'MySQLdb' 。
产生原因:MySQLdb 只支持 Python 2.*,不支持 3.* ,可以用 PyMySQL 代替。
解决方案:安装 pip install PyMySQL,并在调用 db.create_all() 的地方,增加如下代码
import pymysql
pymysql.install_as_MySQLdb()