python - 基于SQLAlchemy-Migrate api编写的数据库管理script,如何获取model包里的数据库table变动?
天蓬老师
天蓬老师 2017-04-17 17:43:14
0
0
398

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

reply all(0)
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template