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

来源:互联网 发布:微创软件南京 编辑:程序博客网 时间:2024/05/21 14:06

数据库的使用是任何程序开发不可缺少的一环,而在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'] = Truedb = 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 shellfrom app import dbfrom app import modelsdb.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,直接使用集成的数据库管理工具就可以方便的查看数据库内容:
这里写图片描述

2. 数据库触发器

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

1.在实体类中增加静态触发方法@staticmethoddef 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 initpython manage.py db migrate -m 'Initial migration'最后,将upgrade方法写入预设的deploy类,可以方便还原@manage.commanddef deploy():    upgrade()    #还可以执行一些初始化数据的脚本    ...

需要迁移时,执行:

python manage.py deploy

阅读全文
1 0
原创粉丝点击