首页 > 数据库 >Flask 学习-19.配置管理flask_sqlalchemy 和 flask_migrate

Flask 学习-19.配置管理flask_sqlalchemy 和 flask_migrate

时间:2022-08-27 00:12:17浏览次数:52  
标签:__ sqlalchemy flask 配置管理 app db config 数据库

前言

前面讲了项目中使用config.py 可以管理开发、生产、测试等环境的配置,这篇继续学习在项目中添加flask_sqlalchemy 和 flask_migrate 的配置

环境准备

先pip安装flask_sqlalchemy 和 flask_migrate

pip install flask_sqlalchemy
pip install flask_migrate

flask_sqlalchemy是封装了sqlalchemy 实现 ORM 操作数据库,flask_migrate 模块可以实现数据迁移和同步。

create_app() 工厂函数

flask_sqlalchemy 注册到app中有2种方法
方法一:直接在初始化的时候传app参数

# 初始化组件对象, 直接关联Flask应用
db = SQLAlchemy(app)

方法二:使用db.init_app(app)方法

# 先实例化,后关联app
db = SQLAlchemy()
# 初始化db,关联flask 项目
db.app = app    # 这一步需先设置属性,很多老的教程都缺少这一步,导致连不上数据库
db.init_app(app)

我们需要在 create_app() 工厂函数中初始化db实例,但是后面数据库操作会用到db对象,所以db对象就不能写对函数内部(函数内部是局部变量)

db = SQLAlchemy() 实例化数据库操作写到函数外部

from flask import Flask
import os
from flask_sqlalchemy import SQLAlchemy
from config import config_env
from flask_migrate import Migrate


db = SQLAlchemy()          # 数据库


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    # 从环境配置文件获取当前环境, 没有就拿缺省值"development"
    env = os.getenv("FLASK_ENV") or "development"
    print(f'当前运行环境:{env}')
    app.config.from_object(config_env.get(env))  # 获取相应的配置类
    # db 数据库初始化
    db.init_app(app)
    # migrate 迁移组件初始化
    Migrate(app, db)

    # app.config.from_mapping(
    #     SECRET_KEY='dev',
    #     DATABASE=os.path.join(app.instance_path, 'apps.sqlite'),
    # )
    #
    # if test_config is None:
    #     # load the instance config, if it exists, when not testing
    #     app.config.from_pyfile('config.py', silent=True)
    # else:
    #     # load the test config if passed in
    #     app.config.from_mapping(test_config)
    #
    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 注册蓝图
    from . import auth
    from . import blog
    app.register_blueprint(auth.bp)
    app.register_blueprint(blog.bp)
    return app

配置不同环境

在config.py 中配置不同环境对象,继承一个基础的Config类

import os


class Config(object):
    # DEBUG = False
    JSON_AS_ASCII = False
    # 设置SECRET_KEY
    SECRET_KEY = os.urandom(24)  # 随机字符串


class DevelopmentConfig(Config):
    """开发环境"""
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/web'
    # 是否追踪数据库修改,一般不开启, 会影响性能
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 是否显示底层执行的SQL语句
    SQLALCHEMY_ECHO = True


class ProductionConfig(Config):
    """生产环境"""
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/web'
    # 是否追踪数据库修改,一般不开启, 会影响性能
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    # 是否显示底层执行的SQL语句
    SQLALCHEMY_ECHO = False


class TestingConfig(Config):
    """测试环境"""
    TESTING = True


# 映射环境对象
config_env = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig
}

模型

在apps.py文件创建一个models.py 模型文件,专门管理数据库模型

from . import db


# 创建模型
class Students(db.Model):
    __tablename__ = 'students'  # 数据库表名

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20))
    fullname = db.Column(db.String(30))
    nickname = db.Column(db.String(30))

    def __repr__(self):
        return "<Students(name='%s', fullname='%s', nickname='%s')>" % (
                 self.name, self.fullname, self.nickname)


class Users(db.Model):
    __tablename__ = 'user'  # 数据库表名

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))

    def __repr__(self):
        return f"<Users(id='{self.id}', name='{self.name}')>"

同步数据库

执行数据库迁移命令

flask db init  # 生成迁移文件夹  只执行一次
flask db migrate  # ⽣成迁移版本, 保存到迁移文件夹中
flask db upgrade  # 执行迁移

于是可以看到生成了对应的表

测试添加数据

在app.py 的hello视图函数中测试添加数据到数据库

from apps import create_app, db
from apps import models


app = create_app()


@app.route('/hello')
def hello():
    # 数据库交互
    # 实例化 Students 模型对象
    user = models.Students(name='yy', fullname='yoyo')
    # 添加到会话,并用commit提交数据
    db.session.add(user)
    db.session.commit()
    return {"code": "0", "msg": "添加成功"}


if __name__ == '__main__':
    app.run()

启动服务后,访问http://127.0.0.1:5000/hello

查看数据库students表,数据添加成功

自动提交commit()

除了查询操作,其它添加数据修改数据,都需要加上 db.session.commit() 才会生效,很多小伙伴容易忘记这个操作,在配置里面可以加一个配置项

    # 不需要commit 自动保存, 默认False
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True

这样不用 db.session.commit() 也会自动保存了。

标签:__,sqlalchemy,flask,配置管理,app,db,config,数据库
From: https://www.cnblogs.com/yoyoketang/p/16629630.html

相关文章

  • 17 - Docker来部署flaskDemo项目
    README.md文件内容:#flaskDemo本接口项目的技术选型:Python+Flask+MySQL+Redis,通过Python+Flask来开发接口使用MySQL来存储用户信息使用Redis用于存储token目......
  • Flask 学习-17.项目配置管理config
    前言项目总是需要一定的配置的。根据应用环境不同,会需要不同的配置。比如开关调试模式、设置密钥以及其他依赖于环境的东西。配置入门我们写的第一个helloworld应用......
  • # flask_socket_io中报错RuntimeError: You need to use the eventlet server. See th
    flask_socket_io中报错RuntimeError:Youneedtousetheeventletserver.SeetheDeploymentsectionofthedocumentationformoreinformation.的解决办法https:/......
  • flask socket cros
    flasksocketcroshttps://flask-socketio.readthedocs.io/en/latest/api.html......
  • flask-restful使用指南
    flask-restful是flask模块的一个扩展,能够快速构建restful风格的api。对于其他的扩展也有很高的兼容性。安装flask_restfulpipinstallflask_restful简单使用fromfl......
  • Flask 学习-16.项目设计与蓝图的使用
    前言一个最简单的Flask应用可以是单个app.py文件,当项目越来越大的时候,把所有代码放在单个文件中就很难维护了。我们需要设计一个项目结构,每个目录做对应的事情。项......
  • [RootersCTF2019]I_<3_Flask-1|SSTI注入
    1、打开之后很明显的提示flask框架,但是未提供参数,在源代码中发现了一个git地址,打开之后也是没有啥用,结果如下:2、这里我们首先需要爆破出来参数进行信息的传递,就需要使用A......
  • Flask 学习-15.flask-migrate数据迁移
    前言Flask-SQLAlchemyORM可以直接操作数据库,可以用db.create_all()代码同步表到数据库。当我们需要修改表的字段,比如对表新增字段,修改字段的时候需用到flask-migrate......
  • flask 可插拔视图
    Flask0.7版本引入了可插拨视图。可插拨视图基于使用类来代替函数,其灵感来自于Django的通用视图。可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分实现。普......
  • Flask 学习-14.Flask-SQLAlchemy ORM操作数据库增删改查
    前言SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的企业级持久模型。它提供了SQL工具包和ORM(对象关系映射)工具,类似于Django自带的ORM框架......