- SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
安装
pip install flask-sqlalchemy
如果是mysql数据库,需要安装:
pip install flask-mysqldb
or pip install pymysql
数据库连接设置
- 设置数据库的连接地址
# 数据库链接地址
# 格式:mysql://<用户名>:<密码>@:<端口>/数据库名称
# 端口可省略
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
# 动态追踪修改设置,如未设置只会提示警告 -->不建议开启 未来会移除
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
- 配置完成后,需要去MySQL中创建项目所使用的数据库
$ mysql -uroot -pmysql
$ create database test charset utf8;
数据库基本操作
- 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
- 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 db.session.commit() 方法提交会话。
- 在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。
- 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
- 常见操作语句
db.session.add(role) 添加对象
db.session.add_all([user1,user2..]) 添加多个对象
db.session.commit() 提交会话
db.session.delete(user) 删除对象
db.session.rollback() 回滚
db.session.remove() 移除会话
在视图函数中定义模型类
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
#设置数据库追踪信息,压制警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#创建SQLAlchemy对象,读取app中配置信息
db = SQLAlchemy(app)
'''
两张表
角色(管理员/用户)Role定义用户有两种 1管理员 2用户
用户(角色ID)User
'''
#定义角色模型(一方)
#数据库的模型,需要继承db.Model
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义列对象
# db.Column表示是一个字段
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(64),unique=True)
#设置关系属性,方便查询使用
us = db.relationship('User', backref='role')
#重写__repr__方法,方便查看对象输出内容
def __repr__(self):
return 'Role:%s'% self.name
# 定义用户模型类(多方)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
# 外键
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
email = db.Column(db.String(64),unique=True)
password = db.Column(db.String(64))
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return 'User:%s'%self.name
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义 backref='role'
if __name__ == '__main__':
#删除所有和db相关联的表
db.drop_all()
#创建所有和db相关联的表
db.create_all()
app.run(debug=True)