flask-SQLAlchemy的使用(CRUD、触发器、迁移)

数据库的使用是任何程序开发不可缺少的一环,而在phython中,SQLAlchemy是最著名的ORM框架。在flask中,自然是flask-SQLAlchemy

以下介绍flask-SQLAlchemy配合sqlite数据库如何使用:

1. 基本用法(创建、CRUD)

首先在py文件中定义

# 1. 实例化并注册
app.config['SQLALCHEMY_DATABASE_URI'] = \
    'sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQlAlchemy(app)

# 2. 建立实体类映射到数据库
class Role(db.Model):
    __tablename__= 'roles'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String,nullable=True)
    # 设置关联其他表(User)
    users = db.relationship('User',backref='role')

class User(db.Model):
    __tablename = 'users'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String,nullable=True)
    # 设置外键关联role
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

而后创建数据库表
进入工程目录,在shell中:

#创建数据库
python manager.py shell
from app import db
from app import models
db.create_all()
from app.models import Role,User
    #添加数据
admins = Role(name='adminiatrators')
mod = Role(name='moderator')
db.session.add_all([amins,mod])
db.session.commit()
    #添加user关联role,这里的'role'是预先定义好的backref的值
jason = User(name='jason',role=admins)
db.session.add(jason)
db.session.commit()
    #修改数据
jason.password = '123'
db.session.add(jason)
db.session.commit()
    #删除数据
db.session.delete(jason)
db.commit()
    #读取数据
User.query.all()
User.query.get(1)
    #加条件查询
User.query.filter(id>0).all()
User.query.filter_by(name='jason').first()

如果你使用的ide是pycharm,直接使用集成的数据库管理工具就可以方便的查看数据库内容:
flask-SQLAlchemy的使用(CRUD、触发器、迁移)_第1张图片

2. 数据库触发器

比如有如下需求:在用户表插入新用户时自动给role字段赋值Guest

1.在实体类中增加静态触发方法
@staticmethod
def on_created(target,value,initiator):
    target.role = Role.query.filter_by(name='Guests').first()

2.添加监听器
db.event.listen(User.name,'append',User.on_created)

3. 数据库变更迁移

此处使用第三方库flask-migrate
迁移前的操作

from flask_migrate import Migrate,MigrateCommand
...
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)

然后在命令行执行初始化操作
python manage.py db init
python manage.py db migrate -m 'Initial migration'

最后,将upgrade方法写入预设的deploy类,可以方便还原
@manage.command
def deploy():
    upgrade()
    #还可以执行一些初始化数据的脚本
    ...

需要迁移时,执行:

python manage.py deploy

你可能感兴趣的:(数据库,flask)