Flask 框架 Script & Migrate

在这里插入图片描述

Flask-Script 介绍

Flask-Script 的作用是可以通过命令行的形式来操作 Flask,例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等

要使用 Flask-Script,可以通过如下命令安装最新版本

pip install flask-script 

首先,下列是一个创建二个表的 Python 文件(my_web.py)(利用了 SQLAlchemy 插件)

from flask import Flask  # 用于 Flask 实例化
from flask_sqlalchemy import SQLAlchemy  # 用于浏览器和数据库的关联(SQLAlchemy 插件)

HOSTNAME = '127.0.0.1'  # 地址
DATABASE = 'mysql_1'  # 数据库
PORT = 3306  # 端口
USERNAME = 'root'  # 用户名
PASSWORD = 'root'  # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # 创建 url

web = Flask(__name__)  # 实例化 Flask 对象

# 映射数据库, 数据库和浏览器关联, SQLAlchemy 插件语法
web.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
web.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(web)


@web.route('/')  # 关联视图函数
def index():  # 视图函数
    return '首页'  # 浏览器显示文本


# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class User(db.Model):
    # 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
    __tablename__ = 'users'
    # 创建字段 id, 数据类型约束 int, 主键, 自增长
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 创建字段 name, 数据类型约束 String
    name = db.Column(db.String(50))

    def __repr__(self):
        return '<User:id:{},name:{}>'.format(self.id, self.name)


# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class Article(db.Model):
    # 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
    __tablename__ = 'articles'
    # 创建字段 id, 数据类型约束 int, 主键, 自增长
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 创建字段 title, 数据类型约束 String
    title = db.Column(db.String(50))
    # 创建字段 uid, 数据类型约束 int, 设置为表 users 字段 id 的外键
    uid = db.Column(db.Integer, db.ForeignKey('users.id'))
    # 创建表关联
    author = db.relationship('User', backref='articles')


# 映射表格到数据库
db.create_all()


if __name__ == '__main__':
    web.run(debug=True)

然后,创建另一个利用 Script 库的 Python 文件(manage.py)

from flask_script import Manager  # 导入 Manager
from my_web import web  # 从 my_web 文件中导入 web 实例


manage = Manager(web)  # 实例化 Manager

# @option('-n', '--name', dest='name')
# @option('-u', '--url', dest='url')


@manage.option('-n', '--name', dest='name')  # dest 为描述
@manage.option('-u', '--url', dest='url')  # dest 为描述
def index(name, url):
    print('hello', name, url)


if __name__ == '__main__':
    manage.run()  # 运行实例

最后,我们在命令行中运行 manage.py 文件

python manage.py index -u=... -n=... 
# python manage 文件里面的 index 视图函数
# 其中 -u 和 -n 指定参数

在这里插入图片描述

Flask-Script 应用

先创建表格 users

from flask import Flask  # 用于 Flask 实例化
from flask_sqlalchemy import SQLAlchemy  # 用于浏览器和数据库的关联(SQLAlchemy 插件)

HOSTNAME = '127.0.0.1'  # 地址
DATABASE = 'mysql_1'  # 数据库
PORT = 3306  # 端口
USERNAME = 'root'  # 用户名
PASSWORD = 'root'  # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # 创建 url

web = Flask(__name__)  # 实例化 Flask 对象

# 映射数据库, 数据库和浏览器关联, SQLAlchemy 插件语法
web.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
web.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(web)


@web.route('/')  # 关联视图函数
def index():  # 视图函数
    return '首页'  # 浏览器显示文本


# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class User(db.Model):
    # 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
    __tablename__ = 'users'
    # 创建字段 id, 数据类型约束 int, 主键, 自增长
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 创建字段 name, 数据类型约束 String
    name = db.Column(db.String(50))

    def __repr__(self):
        return '<User:id:{},name:{}>'.format(self.id, self.name)


# 映射表格到数据库
db.create_all()


if __name__ == '__main__':
    web.run(debug=True)

manage.py 文件

from flask_script import Manager
from my_web import web, User, db


manage = Manager(web)

# @option('-n', '--name', dest='name')
# @option('-u', '--url', dest='url')


@manage.option('-n', '--username', dest='username')
def add_user(username):
    user = User(name=username)
    db.session.add(user)
    db.session.commit()


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

然后控制台执行如下命令后,向表 users 增添了二条数据

python manage.py add_user -n=susu
python manage.py add_user -n=keke

在这里插入图片描述

Flask-Migrate

在实际的开发环境中,经常会发生数据库修改的行为,一般我们修改数据库不会直接手动的去修改,而是去修改 ORM 对应的模型,然后再把模型映射到数据库中,这时候如果有一个工具能专门做这种事情,就显得非常有用了,而 flask-migrate 就是做这个事情的

flask-migrate 是基于 Alembic 进行的一个封装,并集成到 Flask 中,而所有的迁移操作其实都是 Alembic 做的,它能跟踪模型的变化,并将变化映射到数据库中

同样的,flask-migrate 需要安装,安装命令如下

特别注意:flask_ migrate 版本

pip install flask-migrate==2.7.0

Python 文件(manage.py)

控制台操作此文件,具体操作为创建迁移仓库 python manage.py db init 会生成一个迁移文件夹 migrations,所有的迁移文件存放的位置,创建迁移脚本 python manage.py db migrate,更新数据库 python manage.py db upgrade(此时数据库中生成表格)

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from exts import db
# 以上为三个插件
from web_1 import web  # 导入 web 实例
from models import User, Address

manage = Manager(web)

Migrate(web, db)

manage.add_command('db', MigrateCommand)


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

Python 文件(models.py)

此处为数据库提供表格

from exts import db
# 创建二个表格, user , address


class User(db.Model):  # 表格 user
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20))
    addresses = db.relationship('Address',backref='user')


class Address(db.Model):  # 表格 address
    id = db.Column(db.Integer, primary_key=True)
    email_address = db.Column(db.String(50))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

Python 文件(web_1.py)

用于和浏览器作出关联

from flask import Flask  # 用于实例化 Flask 对象
# 用于绑定 Flask 对象, 继承父类, 实例化对象, 判断 url

import config
from exts import db
# from models import

web = Flask(__name__)  # 实例化 Flask 对象
web.config.from_object(config)  # 绑定配置文件
db.init_app(web)  # 绑定 app

if __name__ == '__main__':
    web.run(debug=True, port=7500)

Python 文件(exts.py)

中间文件

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

Python 文件(config.py)

配置项文件

HOSTNAME = '127.0.0.1'  # 地址
DATABASE = 'mysql_3'  # 数据库
PORT = 3306  # 端口
USERNAME = 'root'  # 用户名
PASSWORD = 'root'  # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # 创建 url

SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False

数据库表格创建结果

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我来晚了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值