初学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
欢迎选择我的课程,让我们一起见证您的进步~~