Flask-SQLAlchemy, Flask-script, Flask-migrate

Flask 目录结构, 跟Django非常像...

app.__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 实例化SQLAlchemy
db = SQLAlchemy()

from app.views.book import book


def create_app():
    my_app = Flask(__name__)

    # 初始化app 配置
    my_app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@127.0.0.1:3306/day127sqlalchemy?charset=utf8'
    my_app.config['SQLALCHEMY_POOL_SIZE'] = 5
    my_app.config['SQLALCHEMY_POOL_TIMEOUT'] = 15
    my_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    # 初始化SQLAlchemy ,本质上就是讲以上的配置读出来
    db.init_app(my_app)
    # 蓝图
    my_app.register_blueprint(book)

    return my_app

app.views.book.py

from flask import Blueprint

from app import db
from app.models import Book

book = Blueprint('book', __name__)


@book.route('/book_list')
def book_list():
    book_info_list = Book.query.all()
    print(book_info_list)

    return 'book_list'


@book.route('/book_add')
def book_add():
    db.session.add(Book(name='freedom'))
    db.session.commit()

    return 'ok'

app.models.py

from app import db  # type:db

Base = db.Model


class Book(Base):
    __tablename__ = 'book'
    __table_args__ = {"useexisting": True}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))

    def __repr__(self):
        return self.name


# 离线脚本
if __name__ == '__main__':
    from app import create_app
    app = create_app()
    with app.app_context():
        db.drop_all(app=app)
        db.create_all(app=app)

manager.py

import app
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

my_app = app.create_app()
# 让 app 支持manager
manager = Manager(my_app)
# Migrate 既然是数据库迁移, 就要告诉 支持哪个app, 数据库db 在哪里
Migrate(my_app, app.db)
manager.add_command('db', MigrateCommand)
"""
在命令行输入 数据库迁移指令:
python manager.py db init   # 生成 migrations 文件夹
python manager.py db migrate   # Django中的 makemigration
python manager.py db upgrade  # Django中的 migrate
"""


@manager.command
def my_task(arg):
    # 自定制脚本命令
    print(arg)


@manager.option('-h', '--host', dest='host')
@manager.option('-p', '--post', dest='post')
def my_runserver(host, post):
    # 短指令, 长指令, 变量名dest
    # 在命令行输入 python manager.py my_runserver -h 0.0.0.0  -p 8000
    # 等同于输入 python manager.py runserver -h 0.0.0.0  -p 8000
    print(host, type(host))  # 0.0.0.0 <class 'str'>
    print(post, type(post))  # 8000 <class 'str'>
    my_app.run(host, int(post))


if __name__ == '__main__':
    manager.run()
    # 替换my_app.run(), 在命令行输入 python manager.py runserver

猜你喜欢

转载自www.cnblogs.com/amber-liu/p/10391225.html
今日推荐