擅长:python、mysql、java
<p>编写自定义装饰器:</p>
<pre><code>migrations = {}
def migrate(old_version, new_version):
assert abs(new_version-old_version)==1
def decorator(f):
direction = 'up' if new_version > old_version else 'down'
if old_version not in migrations:
migrations[old_version] = {}
migrations[old_version][direction] = f
return f
return decorator
@migrate(1, 2)
def upgrade():
pass # migration script here
@migrate(2, 1)
def downgrade():
pass # migration script here
@migrate(2, 3)
def upgrade():
pass # migration script here
# etc
print(migrations)
</code></pre>
<p>其输出类似于:</p>
<pre><code>{1: {'up': <function upgrade at 0x02BE4588>}, 2: {'down': <function downgrade at 0x02BE4618>, 'up': <function upgrade at 0x02BE4540>}}
</code></pre>
<p>装饰负责更新<code>migrations</code>字典,但是这样函数可以有任何名称或重复使用相同的名称,也可以在其他模块中(例如,有一个文件用于版本1到2和回滚,另一个文件用于版本2到3和回滚)。你知道吗</p>