flask默认不支持数据库,可使用数据库扩展使其支持数据库(关系型、菲关系型),flask中一般使用SQLALchemy来操作数据库,类似于Django的orm,但更加通用
1. flask数据库配置
SQLAlchemy是一个关系型数据库框架,提供了高层的ORM和底层的原生数据库的操作,flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展
数据库配置:flask-sqlalchemy只能提供数据库操作,需要提前自己创建数据库分配权限
- 1. 安装扩展:pip install falsk-sqlalchemy
连接mysql数据库需要安装flask-mysqldb:pip install flask-mysqldb
- 2. 数据库连接及配置:数据库连接通过URL指定,在app.config里面配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test3'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True # 设置每次请求结束后自动提交数据库中的改动(不建议使用)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 设置数据模型类数据和数据库数据同步(当数据表数据变化,数据模型类属性值同步变化)
app.config['SQLALCHEMY_ECHO'] = True # 查询时会显示原始SQL语句
2. flask数据模型类
同Django相同我们需要定义数据模型类来表示使用的数据实体,数据模型类中的属性对应数据表中的字段
flask数据模型类不会自己添加主键字段,需要手动添加主键字段
数据模型类创建:数据模型类继承自db.Model类
- 创建SQLAlchemy类实例对象用来操作数据库:db = SQLAlchemy(app)
- 创建类属性,对应数据表中的字段
- db.Column(name, type_, **args):字段名(默认为属性名)、字段类型、字段选项(数据表中的真实字段)
- db.relationship("关联表对应的模型类", backref="反向引用属性名"):建立模型类之间的关联,该字段在数据表中非真实存在,只是方便查询
backref:反向引用,在关联表中可使用该属性反向引用
- 自定义对象显示形式:重写__repr__方法(Django中为__str__方法)
- 自定义生成的数据表名:__tablename__ = "xxxx"(默认为类名小写下划线分割形式)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 数据库配置
class DatabaseConfig(object):
SQLALCHEMY_DATABASE_URI = "mysql://yuxi:199618@127.0.0.1:3306/test0"
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.config.from_object(DatabaseConfig) # 导入数据库配置
db = SQLAlchemy(app) # 创建数据库管理对象db
# 创建数据模型类
class Role(db.Model):
"""用户角色表:管理员/用户"""
__tablename__ = "tb_roles" # 自定义生成的表名
id = db.Column(db.Integer, primary_key=True) # 主键列,手动指定,默认自增
name = db.Column(db.String(32), unique=True)
users = db.relationship("User", backref="role") # 创建关联关系:非真实字段只用于查询(backref:反向引用)
def __repr__(self):
# 自定义对象显示形式
return self.name
class User(db.Model):
"""用户表"""
__tablename__ = "tb_users"
id = db.Column(db.Integer