1、SQLAlchemy
pip install flask-sqlalchemy
2、Flask-Migrate
是用于处理SQLAlchemy数据库迁移的扩展工具。当Model出现变更的时候,通过migrate去管理数据库变更。Migrate主要有3个动作,init、migrate 和upgrade。
pip install flask-migrate
3、初始化
import os
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# 设置数据库 URI SQLALCHEMY_DATABASE_URI 变量来告诉 SQLAlchemy 数据库连接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:' + os.path.join(app.root_path, 'da
27
ta.db')
# 如果你使用 Windows 系统,上面的 URI 前缀部分需要写入三个斜线(即 sqlite:/// )
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控
# 在扩展类实例化前加载配置
db = SQLAlchemy(app)
#绑定app和数据库,以便进行操作
migrate = Migrate(app,db)
4、创建数据库模型
- 模型类要声明继承 db.Model 。
- 每一个类属性(字段)要实例化 db.Column ,传入的参数为字段的类型,下面的表格列出了 常用的字段类。
- 在 db.Column() 中添加额外的选项(参数)可以对字段进行设置。比如, primary_key 设 置当前字段是否为主键。除此之外,常用的选项还有 nullable (布尔值,是否允许为空 值)、 index (布尔值,是否设置索引)、 unique (布尔值,是否允许重复 值)、 default (设置默认值)等。
```python
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
5、关系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role')
class User(db.Model):
# ...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
传给 db.ForeignKey() 的参数 ‘roles.id’ 表明, 这列的值是 roles 表中相应行的 id 值。
db.relationship() 中的 backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。通过 User 实例的这个属性可以获取对应的 Role 模型对象,而不用再通过 role_id 外 键获取。
6、常用数据库操作命令
# 删除所有表
db.drop_all()
# 创建所有表
db.create_all()
# 定义表内数据(一行数据)
from hello import Role, User
admin_role = Role(name='Admin')
mod_role = Role(name='Moderator')
ser_role = Role(name='User')
user_john = User(username='john', role=admin_role)
user_susan = User(username='susan', role=user_role)
user_david = User(username='david', role=user_role)
# 添加数据(添加一行)
db.session.add(admin_role)
db.session.add_all([admin_role, mod_role, user_role, ... user_john, user_susan, user_david])
# 提交修改
db.session.commit()
# 删除数据
db.session.delete(mod_role)
db.session.commit()
# 查询
Role.query.all()
# 使用过滤器可以配置query 对象进行更精确的数据库查询。下面这个例子查找角色为 "User" 的所有用户:
User.query.filter_by(role=user_role).all()