使用alembic自动生成迁移

时间:2012-06-24 18:16:40

标签: python sqlalchemy database-migration alembic

在教程中: http://alembic.readthedocs.org/en/latest/tutorial.html 我通过以下命令测试了自动生成迁移功能:

alembic revision --autogenerate -m "Added account table"

并收到错误:

Traceback (most recent call last):
File "/usr/local/bin/alembic", line 9, in <module>
load_entry_point('alembic==0.3.4', 'console_scripts', 'alembic')()
File "/usr/local/lib/python2.7/dist-packages/alembic-0.3.4-py2.7.egg/alembic/config.py", line 229, in main
 **dict((k, getattr(options, k)) for k in kwarg)
File "/usr/local/lib/python2.7/dist-packages/alembic-0.3.4-py2.7.egg/alembic/command.py", line 93, in  revision
script.run_env()
File "/usr/local/lib/python2.7/dist-packages/alembic-0.3.4-py2.7.egg/alembic/script.py", line 188, in run_env
 util.load_python_file(self.dir, 'env.py')
File "/usr/local/lib/python2.7/dist-packages/alembic-0.3.4-py2.7.egg/alembic/util.py", line 185, in load_python_file
module = imp.load_source(module_id, path, open(path, 'rb'))
File "alembic/env.py", line 20, in <module>
from myapp.mymodel import Base
ImportError: No module named myapp.mymodel

我只是在学习alembic,而且从未使用过python。 myapp.mymodel已经存在,或者我需要使用python创建它。怎么做?非常感谢你!

1 个答案:

答案 0 :(得分:20)

“myapp.mymodel已经存在,或者我需要使用python创建它。怎么做?” - 如果你问的话,听起来好像你还没有任何需要迁移的东西。

迁移的想法,即la Alembic,如下所示:

  1. 首先,通常在python代码中定义数据模型 通过一堆使用sqlalchemy的类声明 '声明'建模结构。这发生在一个名为的文件中 'mymodel.py'。或者如果您的应用程序较大,您可能有多个文件,然后将它们全部导入mymodel.py以将其符号放入一个方便的位置 命名空间。这个mymodel.py - 或任何你的名字 - 然后 在一个名为myapp的目录中。你会指示 通过在其中放入__init__.py文件,'myapp'是一个模块的python(可以是 空的,或者可以有其他内容...阅读python项目 和模块结构有关详情,请参见下面#3中的链接。

  2. 稍后您更改了模型定义 文件或文件,它们已经离开了您的实际数据库架构(就像您的 数据库引擎看到它,就像你在GUI或它中看到的那样 命令行数据库管理客户端)落后一步。所以现在你 需要一个系统来发出必要的命令来修复 差异。

  3. 这就是Alembic的用武之地。它需要看两件事:你的实际数据库,这就是你为它提供数据库连接字符串的原因,以及你期望在python中找到的数据模型定义文件,例如mymodel.py或您可能提供的任何名称。有可能 命名以.py结尾的任何东西,它可以以任何方式定位 希望,只要你能让Alembic进口它。如果是机械师 这样做对你来说还不清楚,它只是一个普通的python习语 您需要学习 - 模块的结构如何 文件系统以及如何相应地导入它们。这是一个开始 那:http://docs.python.org/tutorial/modules.html

  4. 如果您没有任何已经识别为包含模型声明的python文件的内容,那么您可能需要在担心迁移等问题之前需要对sqlalchemy进行更多练习。