初学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