bob*_*bby 6 python orm sqlalchemy alembic
我正在尝试使用 sqlAlchemy 和 Alembic 迁移 SQL 数据库。我想直接在 Python 代码中制作简单的迁移脚本,而不是使用 Alembic CLI,如文档中所述。
我只在这个主题上找到了这个 SO 问题:Using Alembic API from inside application code
使用这个问题 + Flask-Alembic 源代码,我尝试了这些简单的命令。引擎链接到我的数据库,元数据包含迁移信息。
我认为我非常接近,解决方案应该在一行代码中......我很挣扎。
from alembic.config import Config
from alembic import command, autogenerate
from alembic.script import ScriptDirectory
from alembic.runtime.environment import EnvironmentContext
alembic_cfg = Config()
alembic_cfg.set_main_option("script_location", "migrations")
alembic_cfg.set_main_option("url", "postgresql://user:pass@postgres:5432/mydb")
alembic_script = ScriptDirectory.from_config(alembic_cfg)
alembic_env = EnvironmentContext(alembic_cfg, alembic_script)
conn = engine.connect()
alembic_env.configure(connection=conn, target_metadata=metadata)
alembic_context = alembic_env.get_context()
Run Code Online (Sandbox Code Playgroud)
我能够使用以下命令来查看它是否有效并检测哪些字段必须迁移:
autogenerate.compare_metadata(alembic_context, metadata)
autogenerate.produce_migrations(alembic_context, metadata)
Run Code Online (Sandbox Code Playgroud)
但是,我无法运行迁移。我尝试了几个命令,但总是出现错误...
例如,如果我运行:
with alembic_env.begin_transaction():
alembic_env.run_migrations()
Run Code Online (Sandbox Code Playgroud)
我得到:
/usr/local/lib/python2.7/site-packages/alembic/runtime/migration.pyc in run_migrations(self, **kw)
301 head_maintainer = HeadMaintainer(self, heads)
302
--> 303 for step in self._migrations_fn(heads, self):
304 with self.begin_transaction(_per_migration=True):
305 if self.as_sql and not head_maintainer.heads:
TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我。我认为解决方案是单行的,但我找不到如何在我的数据库上运行迁移...
有关信息,我从未使用 Alembic 在此数据库上做过任何迁移,也许需要“init”?
非常感谢。
for step in self._migrations_fn(heads, self):
在这里我们将描述您想要迁移的顺序。该序列由步骤组成,每个步骤都有step.migration_fn(**kw)。
您需要的最后一步是_migrations_fn在执行时添加alembic_env.configure。
def do_upgrade(revision, context):
return alembic_script._upgrade_revs(script.get_heads(), revision)
alembic_env.configure(connection=conn, target_metadata=metadata, fn=do_upgrade)
Run Code Online (Sandbox Code Playgroud)
script.get_heads()返回最后一次迁移。如果您需要特定修订版,请替换而不是最后一个修订版。
相关链接: