5

在教程中: 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 创建它。怎么做?非常感谢你!

4

1 回答 1

22

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

迁移的想法,à la Alembic,是这样的:

  1. 首先,您在 python 代码中定义了数据模型,通常是通过使用 sqlalchemy 的“声明性”建模结构的一堆类声明。这发生在一个名为“mymodel.py”的文件中。或者,如果您的应用程序较大,您可能有多个文件,然后将它们全部导入 mymodel.py 以将它们的符号带入一个方便的命名空间。这个 mymodel.py —— 或任何你命名的文件 —— 将位于名为 myapp 的目录中。您可以通过将文件放入其中来向 python 表明“myapp”是一个模块__init__.py(可以是空的,也可以在其中包含其他内容...阅读 python 项目和模块结构以获取更多信息,请参阅链接下面的#3)。

  2. 稍后,您更改了该文件或文件中的模型定义,这留下了您的实际数据库模式(正如您的数据库引擎所看到的那样,就像您在 GUI 或命令行数据库管理客户端中看到它的方式一样)退后一步。所以现在你需要一个系统来发出必要的命令来修复差异。

  3. 这就是 Alembic 的用武之地。它需要查看两件事:您的实际数据库,这就是您为其提供数据库连接字符串的原因,以及您的数据模型定义,它希望在诸如 mymodel.py 之类的 python 文件中找到它或任何你可以给它起的名字。它可以命名为任何以 .py 结尾的名称,并且可以以任何您希望的方式定位,只要您可以让 Alembic 导入它。如果您不清楚这样做的机制,那么您需要学习的只是一个通用的 Python 习语——模块在文件系统中的结构以及如何相应地导入它们。这是一个开始:http: //docs.python.org/tutorial/modules.html

If you don't have anything that you already recognize as the python file containing your model declarations, it might be the case that you just need more practice with sqlalchemy before you worry about issues like migration.

于 2012-06-25T16:33:57.143 回答