Maison >développement back-end >Tutoriel Python >Introduction à l'utilisation de flask_migrate et flask_script en python (avec code)

Introduction à l'utilisation de flask_migrate et flask_script en python (avec code)

不言
不言avant
2018-11-15 15:01:023227parcourir

Cet article vous apporte une introduction à l'utilisation de flask_migrate et flask_script en python (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

flask_migrate

Lors de l'utilisation de falsk_sqlalchemy, l'utilisation de 'db.create_all' ne sera pas automatiquement mappée à la base de données lors de la modification ultérieure des champs de la table de base de données et doit être supprimée.

puis réexécutez 'db.create_all' sera remappé. Cela ne répond pas à nos exigences, donc flask-migrate doit résoudre
ce problème. Il peut mapper les champs modifiés à la base de données après chaque modification du modèle (classe)

from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import pymysql
from sqlalchemy import desc
from flask_bootstrap import Bootstrap


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/migrate_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
app.config['SECRET_KEY'] = 'SHEEN'
bootstrap = Bootstrap(app)

class User(db.Model):
    id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)
    # 用户名唯一且不能为空
    name = db.Column(db.String(30),unique=True,nullable=False)
    # 测试:添加gender属性
    gender = db.Column(db.BOOLEAN,default=True)
    todos = db.relationship('Todo',backref='user')

class Todo(db.Model):
    id = db.Column(db.INTEGER, autoincrement=True, primary_key=True)
    # unique: 指定该列信息是唯一的;
    name = db.Column(db.String(50))
    user_id = db.Column(db.INTEGER,db.ForeignKey('user.id'))
if __name__ == '__main__':
    db.create_all()

Lorsque les tables de base de données user et todo ont été générées et que les tables contiennent des données. À l'heure actuelle, nous devons ajouter des attributs (sexe de l'utilisateur) à la table de la base de données sans affecter l'utilisation de l'utilisateur. Nous utilisons la migration de la base de données pour la gérer et ajoutons le code pour générer les attributs dans le modèle de fichier d'opération de base de données d'origine

 # 测试:添加gender属性
    gender = db.Column(db.BOOLEAN,default=True)

migrer les attributs principaux

Créer un entrepôt de migration (répertoire des migrations)

python manager.py  db init

Lire le contenu de la classe et générer le fichier de version, qui n'est pas actuellement dans la base de données Ajouter ou supprimer ;

python manager.py  db migrate -m "添加性别"

a été supprimé dans la base de données

python manager.py  db upgrade

pour afficher l'état historique des modifications ; renvoie l'état de la version spécifié ;

python manager.py  db history

python manager.py  db downgrade  base

Introduction à lutilisation de flask_migrate et flask_script en python (avec code)Gérer les modifications de la base de données

Créer un nouveau fichier manage.py pour gérer les modifications de la base de données

Étapes :

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

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

flask_script
1. 初始化(自动生成migrations目录)
python manager.py db init

2. 生成最初的迁移
python manager.py db migrate -m '添加用户性别'
出现语句:Detected added column 'user.gender',表明对model有所改动

3.数据库升级
python manager.py db upgrade
生成数据库历史版本的py文件:Running upgrade  -> 202a710ebeb6, '添加用户性别'

L'extension Flask Script fournit la fonction d'insérer des scripts externes dans Flask, créant ainsi le script et système séparé

Cadre global

Tout d'abord, créez un modèle Python pour exécuter le script de commande, qui peut être nommé script.pyDans ce fichier, il y a doit être une instance Manager et la classe Manager suit toutes les commandes sur la ligne de commande. La commande appelée et l'état de l'opération d'appel du processus de traitement

Manager n'a qu'un seul paramètre - Instance Flask



Créer une commande
from flask_script import Command,Manager
from flask import Flask

app = Flask(__name__)

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

Deuxièmement, créez et rejoignez la commande. Il existe trois façons de créer une commande, à savoir créer une sous-classe Command, en utilisant le modificateur @command et en utilisant le modificateur @option

La première façon - créer une sous-classe Command
La sous-classe doit définir une La méthode run

crée la commande Hello et ajoute la commande Hello à l'instance Manager



La deuxième méthode - en utilisant le modificateur @command de l'instance Command

class  Hello(Command):
    """欢迎信息"""
    def run(self):
        print('hello,sheen')

manager.add_command('hello',Hello)

La troisième méthode ——Utilisez le modificateur @option de l'instance de commande

Il est recommandé d'utiliser @option;, vous pouvez transmettre plusieurs paramètres
@manager.command
def add_user():
    """添加用户信息"""

    print('添加用户成功')


Exemple complet
@manager.option('-n','--name',help='删除用户')
def del_user(name):
    """删除用户信息"""

    if name:
        print('删除用户%s成功' %(name))
    else:
        print('用户名为空!')

# script.py
from flask_script import Command,Manager
from flask import Flask

app = Flask(__name__)

manager = Manager(app)

class  Hello(Command):
    """欢迎信息"""
    def run(self):
        print('hello,sheen')

manager.add_command('hello',Hello)

@manager.command
def add_user():
    """添加用户信息"""

    print('添加用户成功')

@manager.option('-n','--name',help='删除用户')
def del_user(name):
    """删除用户信息"""

    if name:
        print('删除用户%s成功' %(name))
    else:
        print('用户名为空!')
if __name__ == '__main__':
    manager.run()

Introduction à lutilisation de flask_migrate et flask_script en python (avec code)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer