flask数据库迁移 flask_migrate (不降级使用)

网上很多教程都是针对对老版本的flask_migrate的
具体教程参考:
http://t.csdn.cn/mx3gz
但是 如果安装了最新的flask_migrate, 新版本会提示没有 MigrateCommand
方法一 是 安装低版本的 flask_migrate:
pip install flask_migrate==2.7.0

方法二是就是本文的方法,如下:

1 python 版本 3.8.10

目录结构
.
|-- app.py 入口程序
|-- config.py 全局配置
|-- ext.py 对数据库的声明单独放在一个文件
|-- migrations 执行迁移过程,产生的映射文件(不必关心)
|-- models.py ORM模型构造
|-- static …
|-- templates …
`-- venv 虚拟环境(不必关心)

1.app.py
项目代码的入口,完成主要的配置和开始运行。

#安装依赖:  
	#pip install flask-migrate
	#pip install pymysql
	#pip install SQLAlchemy
	#pip install flask-sqlalchemy
#迁移命令
#flask db init
#flask db migrate
#flask db upgrade

from flask import Flask
from markupsafe import escape
import os
from ext import db
import config
from views.first_blue import first_blue #蓝图模块
from flask_migrate import Migrate

def create_app():
    app = Flask(__name__)
    # 设置session秘钥, os.urandom(24) 会从 0-9,a-z A-Z中随机选中24个字符串用做加密session的秘钥
    app.secret_key = os.urandom(24)
    app.config.from_object(config)
    db.init_app(app)  # app绑定数据库db
    with app.app_context():
        db.create_all()
        Migrate(app, db)
    app.register_blueprint(first_blue) #注册蓝图(也就是路由/视图)
    return app
    
if __name__ == '__main__':
    app = create_app()
    app.run(ssl_context=('server.crt', 'server.key'))

2.ext.py
为了避免一些外部模块和app.py之间的循环引用,对此将数据库db的声明单独放置一个文件中。

from flask_sqlalchemy import SQLAlchemy
from xg.log import log #日志模块
import config
import os

db = SQLAlchemy()
m_log = log(os.path.join(config.current_path, "log.txt"))

3.config.py
用来存放一些全局的配置信息,一般是非常非常重要的配置信息。
#数据库配置信息

import os
HOSTNAME = '127.0.0.1'
PORT     = '3306'
DATABASE = 'mydb'
USERNAME = 'root'
PASSWORD = 'password'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
 
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

current_path = os.path.dirname(os.path.abspath(__file__))
img= os.path.join(current_path, "static/img")

SQLALCHEMY_COMMIT_ON_TEARDOWN = True

4.models.py
用来构造ORM模型,这个是对数据库表格的映射。后面迁移过程会使用到。

from ext import db
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    userName = db.Column(db.String(20), unique=False,nullable=False ,index=True)
    userID = db.Column(db.String(18), unique=True,nullable=False, index=True)

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

5 迁移数据库
在 app.py 所在文件夹的终端中输入以下命令:
flask db init
flask db migrate
flask db upgrade

在mysql 下可以看到更新完成的结果

mysql> select * from users;

6 一些坑:
models.py 中,模型的名字必须是小写,否则
flask db upgrade 总是认为模型的表名字和实际数据表名字不一致,会新建表导致错误:
err.InternalError: (1050, “Table ‘users’ already exists”)

__tablename__ = 'users' #表名必须小写
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值