为了简化数据库操作,我们将使用SQLAlchemy一个数据库工具(ORM,即对象关系映射)。借助SQLAlchemy,你可以通过定义Python类来表示数据库里的一张表(类属性表示表中的字段/列),通过对这个类进行各种操作来代替写SQL语句。这个列我们称之为模型类,类中的属性我们将称之为字段。
Flask有大量的第三方扩展,这些扩展可以简化和第三方库的集成工作。
首先我们要“初始化”操作。导入扩展类,实例化并传入Flask程序实例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app=Flask(__name__)
db=SQLAlchemy(app)
class Config(object):
"""配置参数"""
#sqlalchemy的配置参数
SQLALCHEMY_DATABASE_URI="mysql://root:[email protected]:3306/db_python04"
#设置sqlalchemy自动跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS=True
app.config.from_object(Config)
SQLALCHEMY_DATABASE_URL的组成为:数据库类型名称://数据库用户名名称:密码@地址:端口/数据库名称
告诉数据库的连接地址
class Role(db.Model):
"""用户角色/身份表"""
__tablename__="tbl_roles"
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(32),unique=True)
users=db.relationship("User",backref="role")
class User(db.Model):
"""用户表"""
__tablename__="tbl_users" #指明数据库表名
id=db.Column(db.Integer,primary_key=True) #主键 整型的主键默认设置为自增
name=db.Column(db.String(64),unique=True) #唯一性
email=db.Column(db.String(128),unique=True)
password=db.Column(db.String(128))
role_id=db.Column(db.Integer,db.ForeignKey("tbl_roles.id")) #外键字段
模型类的编写的限制:
db.Column()
中添加额外的选项(参数)可以对字段进行设置。比如,primary_key
设置当前字段是否为主键。除此之外,常用的选项还有 nullable
(布尔值,是否允许为空值)、index
(布尔值,是否设置索引)、unique
(布尔值,是否允许重复值)、default
(设置默认值)等。常用的字段类型如下所示:
#使用drop_all清除数据库中的所有数据
db.drop_all()
#创建所有的表
db.create_all()
db.drop_all()删除之前创建过的所有数据
db.create_all()创建所有的表
role1=Role(name="admin")
#session记录对象任务
db.session.add(role1)
#提交任务到数据库中
db.session.commit()
最后一行 db.session.commit()
很重要,只有调用了这一行才会真正把记录提交进数据库,前面的 db.session.add()
调用是将改动添加进数据库会话(一个临时区域)中。
通过对模型类的query属性调用可选的过滤方法,我们就可以获取到单个或多个记录(记录以模型类的实例表示)。查询语句如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>
下面是一些常用的过滤方法:
下面是一些常用的查询方法:
user=User.query.get(1)
user.name="li"
user.email="[email protected]"
db.session.commit()
更新User表中主键为1的数据,姓名改成li,email改为[email protected]
user=User.query.get(1)
db.session.delete(user)
db.session.commit()
删除主键为1的数据