<p>下面是一个纯编程示例,演示如何以编程方式配置和调用alembic命令。</p>
<p><strong>目录设置</strong>(便于代码阅读)</p>
<pre><code>. # root dir
|- alembic/ # directory with migrations
|- tests/diy_alembic.py # example script
|- alembic.ini # ini file
</code></pre>
<p>这里是diy_alembic.py</p>
<pre><code>import os
import argparse
from alembic.config import Config
from alembic import command
import inspect
def alembic_set_stamp_head(user_parameter):
# set the paths values
this_file_directory = os.path.dirname(os.path.abspath(inspect.stack()[0][1]))
root_directory = os.path.join(this_file_directory, '..')
alembic_directory = os.path.join(root_directory, 'alembic')
ini_path = os.path.join(root_directory, 'alembic.ini')
# create Alembic config and feed it with paths
config = Config(ini_path)
config.set_main_option('script_location', alembic_directory)
config.cmd_opts = argparse.Namespace() # arguments stub
# If it is required to pass -x parameters to alembic
x_arg = 'user_parameter=' + user_parameter
if not hasattr(config.cmd_opts, 'x'):
if x_arg is not None:
setattr(config.cmd_opts, 'x', [])
if isinstance(x_arg, list) or isinstance(x_arg, tuple):
for x in x_arg:
config.cmd_opts.x.append(x)
else:
config.cmd_opts.x.append(x_arg)
else:
setattr(config.cmd_opts, 'x', None)
#prepare and run the command
revision = 'head'
sql = False
tag = None
command.stamp(config, revision, sql=sql, tag=tag)
#upgrade command
command.upgrade(config, revision, sql=sql, tag=tag)
</code></pre>
<p>代码或多或少是从<a href="https://github.com/miguelgrinberg/Flask-Migrate/blob/master/flask_migrate/__init__.py" rel="noreferrer">this Flask-Alembic file</a>中截取的。这是查看其他命令用法和详细信息的好地方。</p>
<p><strong>为什么要这样做?</strong>-它是为了在运行自动测试时创建alembic标记、升级和降级而编写的。</p>
<ul>
<li>chdir(迁移目录)干扰了一些测试。</li>
<li>我们希望有一个数据库创建和操作的来源。”如果我们用alembic、alembic而不是metadata打包和管理数据库,create_all()shell也可以用于测试”。</li>
<li>即使上面的代码超过4行,alembic显示自己是一个很好的可控野兽,如果这样驱动。</li>
</ul>