使用Alembic自动生成数据库迁移

6
在教程中: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创建?如何操作呢?非常感谢!


我发现以下网站可能会有所帮助:http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg26799.html - user1342336
1个回答

22
如果你问的是"myapp.mymodel"是否已经存在,或者我需要使用Python创建它。如何操作?如果您这样问,那么似乎您还没有需要迁移的任何内容。
像Alembic一样的迁移的想法是这样的:
  1. 首先,你需要在Python代码中定义数据模型,通常使用SQLAlchemy的“declarative”建模结构来进行。这通常在一个名为“mymodel.py”的文件中完成。如果你的应用程序更大,你可能会有多个文件来完成这个任务,然后将它们全部导入到mymodel.py中,以便将它们的符号带入一个方便的命名空间中。这个mymodel.py - 或者你给它起的任何名字 - 然后会在一个名为myapp的目录中。你需要在其中放置一个__init__.py文件,告诉Python“myapp”是一个模块(可以为空,也可以包含其他内容...请阅读有关Python项目和模块结构的更多信息,请参见下面第3个链接)。

  2. 稍后,你可能会在该文件或文件中更改模型定义,这将使你的实际数据库架构(作为你的数据库引擎所看到的,就像你在GUI或命令行数据库管理客户端中看到的那样)落后一步。所以现在你需要一个系统来发出必要的命令来修复这些差异。

  3. 这就是Alembic的作用。它需要查看两个东西:你的实际数据库,这就是为什么你要给它你的数据库连接字符串,以及你的数据模型定义,它期望在一个名为mymodel.py或任何你可能给它的名称的Python文件中找到。它可以被命名为任何以.py结尾的东西,并且可以按照你希望的任何方式定位,只要你能让Alembic导入它就可以了。如果你对如何实现这一点的机制不清楚,那么你需要学习一般的Python惯用语 - 模块在文件系统中的结构以及如何相应地导入它们。这里是一个开始:http://docs.python.org/tutorial/modules.html

如果您没有任何已被识别为包含模型声明的 Python 文件,那么您可能需要在担心迁移等问题之前更多地练习 SQLAlchemy。请注意,这里不提供解释。保留 HTML 标记。

非常感谢!作为一个初学者,这正是我应该遵循的。 - user1342336

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接