《Flask development》flask数据库笔记

来源:互联网 发布:用sql语句创建表步骤 编辑:程序博客网 时间:2024/05/16 09:26

数据库是web开发中必然要接触到的,也是web程序中比较重要的组成。

书中使用的数据库是关系型数据库,即SQL 数据库,使用结构化查询语言。这里使用的是轻量级别的SQLite包。

选用数据库框架考虑的因素:

  • 易用性
  • 性能
  • 可移植性
  • Flask集成度

这里使用的是Flask-SQLAlchemy管理数据库,提供了高层的ORM,也提供了使用数据库原生 SQL 的低层功能。

抽象层,也称为对象关系映射(Object-Relational Mapper,ORM)或对象文档映射(Object-Document Mapper,ODM),在用户不知觉的情况下把高层的面向对象操作转换成低层的数据库指令。

定义模型:

在 ORM 中,模型一般是一个 Python 类,继承db.Model, 类中的属性对应数据库表中的列。

这里写图片描述

这里写图片描述
这里写图片描述

关系:

  • 一对多(简单):一对多, 一对一,多对一
  • 多对多(复杂):借助第三张表

Flask-SQLAlchemy配置键

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy#配置数据库app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db/users.db'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app) #db对象是 SQLAlchemy 类的实例class Role(db.Model):    # ...    users = db.relationship('User', backref='role')class User(db.Model):    # ...    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

添加到 Role 模型中的 users 属性代表这个关系的面向对象视角。对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列表。 db.relationship() 的第一个参数表明这个关系的另一端是哪个模型。如果模型类尚未定义,可使用字符串形式指定。

db.relationship() 中的 backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。这一属性可替代 role_id 访问 Role 模型,此时获取的是模型对象,而不是外键的值。

您想要使用不止一个应用或者在一个函数中动态地创建应用的话。如果您在一个函数中定义您的应用,但是 SQLAlchemy 对象是全局的,后者如何知道前者了?答案就是 init_app() 函数。

数据库操作:

>>> db.create_all() #创建表>>> db.drop_all() #删除表>>> admin_role = Role(name='Admin') #插入或修改行,直接赋值>>> db.session.add(admin_role) #准备把对象写入数据库之前,先要将其添加到会话中>>> db.session.delete(mod_role) #删除行>>> db.session.commit() #把对象写入数据库,提交>>> Role.query.all() #查询行>>> User.query.filter_by(role=user_role).all() #过滤查询!

这里写图片描述

这里写图片描述

使用Flask-Migrate实现数据库迁移:

  • 安装:
pip install flask-migrate
  • 配置:
from flask.ext.migrate import Migrate, MigrateCommand# ...migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)
  • 使用:
(venv) $ python hello.py db init #创建迁移创库(venv) $ python hello.py db migrate -m "initial migration" #创建迁移脚本(venv) $ python hello.py db upgrade #更新数据库

数据库迁移可能会遇到各种小问题,失败报错之类,因为不是在生产环境,所以可以简单粗暴删除xx.sqlite文件和迁移仓库里的迁移脚本,再重新创建迁移脚本,更新数据库即可

0 0