Flask数据库创建以及升级流程

最近学习《Flask Web开发》,数据库创建使用以及升级流程总是让我感到混乱,因此总结一下。

Flask数据库用到两个库:Flask-SQLAlchemy和Flask-Migrate

  • 使用Flask-SQLAlchemy管理数据库
  • 使用Flask-Migrate实现数据库迁移

安装:

pip install Flask-SQLAlchemy
pip install Flask-Migrate

创建数据库

  • 进入python shell
    python manage.py shell 
    
    导入db
    from app import db
    
    导入model中User Role模型(这个很重要,要不创建出数据库后会没有表)
    from app.models import Role,User
    
  • 创建数据库
    db.create_all()
    

执行完成之后,会生成一个data.sqlite文件,文件中会生成相应的表,如果上步没有引入Role,User,这里创建出来文件里会没有对应的表

数据库迁移

第一次使用
  1. 初始化:
    python manage.py db init 
    
    这个命令会在项目下创建 migrations 文件夹,所有迁移脚本都存放其中。
  2. 创建第一个版本:
    python manage.py db migrate -m "initial migration"  
    
    检查migrations\versions,会新建一个版本.py,检查里面表格及字段,此时数据库中会自动创建一个alembic_version表格,用于记录数据库版本信息
  3. 运行升级
    python manage.py db upgrade
    
    会把项目使用的数据库文件,更新为新的表格、字段,同时保留数据
数据库更新
  1. 更新表格的字段 (models.py)
  2. 再次运行一下
    python manage.py db migrate -m "commit" 
    
    相当于commit 更新到/migrate目录
  3. 数据库更新
    python manage.py db upgrade  
    
    数据库会更新
数据库字段回滚

获取 History ID

python manage.py db history

回滚到某个 history

python manage.py db downgrade <history_id>

注意

  1. 数据库迁移的时候,如果manage.py里没有导入Role和User,模型对应表结构,迁移脚本拿不到模型,就会删除数据库里对应的表。这地方掉坑里好久。
  2. 在创建数据库的时候也需要导入模型Role和User

为了避免一直重复导入,我们可以做些配置,让 Flask-Script 的 shell 命令自动导入特定的对象。
所以我们干脆在manage.py文件里统一代码处理,减少出错的可能性:

  1. 导入相应文件:Shell(和python shell相关),User, Role数据模型

    from flask_script import Shell
    from app.models import User, Role
    

    此时数据库升级的时候就能拿到模型知道表结构了,可以正常升级了。还可以进一步处理在创建数据库的时候也不需要手动导入:

  2. def make_shell_context():
        return dict(app=app, db=db, User=User, Role=Role)
    manager.add_command('shell', Shell(make_context=make_shell_context))
    

这样做了之后创建数据库时不需要这一步:

from app.models import Role,User

导入模型。
其余不变,不会再导致表丢失的问题

参考:

http://blog.csdn.net/kevin_qq/article/details/51777190

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,309评论 22 257
  • 上一章3 郁单国 穿越女穆惜凡大睡了一天一夜,发现自己跟以前长得不大一样,但又能看得出自己原来的模样。这个时空实在...
    要饭团阅读 3,538评论 0 0
  • 丁酉年 己酉月 己未日 金木水火土里,己是土,未是木库,木克土,己土坐在很多很多克自己的东西上,会很辛苦吧。 未,...
    黄谦颐阅读 4,276评论 0 6
  • 你画树的脸, 人看着的风霜 你泼墨染成年月; 你留人的影, 迎着他的过往 目送她的远去; 你听路的心, 多少脚步轻...
    含深阅读 1,450评论 0 0

友情链接更多精彩内容