python - 基于SQLAlchemy-Migrate api编写的数据库管理script,如何获取model包里的数据库table变动?

 yuanguo374 发布于 2022-10-30 16:10

初学Python,跟着Miguel的Flask Mega Tutorial学习Flask,在第四章关于DB的内容中有一段,有一段使用SQLAlchemy-Migrate api自动截取db变动,并生成migrate script的功能。涉及到 imp 和 exec()的内容不是很明白,向大家求教:

import imp
from migrate.versioning import api
from app import db
from config import SQLALCHEMY_DATABASE_URI  
from config import SQLALCHEMY_MIGRATE_REPO 

v = api.db_version(SQLALCHEMY_DATABASE_URI, 
                   SQLALCHEMY_MIGRATE_REPO)
migration = SQLALCHEMY_MIGRATE_REPO +     
            ('/versions/%03d_migrate.py' % (v + 1))

tmp_module = imp.new_module('old_model')

old_model = api.create_model(SQLALCHEMY_DATABASE_URI, 
                             SQLALCHEMY_MIGRATE_REPO)
exec(old_model, tmp_module.__dict__)

scripts = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, 
          SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, 'wt').write(scripts)

api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print('The migration script is stored as ' + migration)
print('The current version: %03d' % (v,))

想要请教的问题是:我的Table类都放在app/models.py中,而这段代码则是保存在app的根目录,其中也没有直接引用到models,那么到底是如何获取我做的models的变动的?我知道事情应该是发生在tmp_module, old_model还有exec()这几个语句中,但是涉及内容比较深,独立出来看明白要干啥,但是整体联系起来就不为什么 exec之后,tmp_module拿到了最新的meta

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有