如何使Alembic从Flask中的多个模型文件中识别模型

Joh*_*ike 2 python flask alembic

因此在Flask中,我models.py包含了所有我的模型定义。我想将其分离到一个models目录下的多个模型文件中。

我通过添加一些模型文件(例如models/user_model.pymodels/booking_model.py等进行了尝试,但alembic似乎无法检测到这些文件中的模型。

在带有Flask的标准alembic.ini中,我具有:

# A generic, single database configuration.

[alembic]
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s

# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false


# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = WARN
handlers = console
qualname =

[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine

[logger_alembic]
level = INFO
handlers =
qualname = alembic

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
Run Code Online (Sandbox Code Playgroud)

我是否需要在此处添加一些内容以使模型识别出来?

Ale*_*sov 8

你需要编辑你的 env.py:

# add your model's MetaData object here
# for 'autogenerate' support
from your_cool_app.models import *
target_metadata = db.Model.metadata
Run Code Online (Sandbox Code Playgroud)

  • 您能进一步解释一下吗?什么是“db.Model”? (6认同)

小智 6

要完成此答案,您可以将所有“基本”直接放入列表,如下所示:

from myapp.mymodel1 import Model1Base
from myapp.mymodel2 import Model2Base
target_metadata = [Model1Base.metadata, Model2Base.metadata]
Run Code Online (Sandbox Code Playgroud)

链接到文档:http : //alembic.zzzcomputing.com/en/latest/autogenerate.html#autogenerating-multiple-metadata-collections


Dav*_*des 5

我遇到了完全相同的事情。

这是我的结构

.. alembic
.. .. alembic stuff
.. database
.. .. __init__.py
.. .. models.py
.. .. my_table_one.py
.. .. my_table_two.py
Run Code Online (Sandbox Code Playgroud)

在你的init中创建基础,如下所示:

# creates Base
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata
Run Code Online (Sandbox Code Playgroud)

然后在我的 models.py 中导入 Base 和所有表

from database import Base
from database.my_table_one import MyTableOne
from database.my_table_two import MyTableTwo
Run Code Online (Sandbox Code Playgroud)

在我的表中,我从数据库模块导入基础

from database import Base
Run Code Online (Sandbox Code Playgroud)

最后我的 env.py 非常简单:

from database.models import Base
target_metadata = [Base.metadata]
Run Code Online (Sandbox Code Playgroud)

这样做的原因是这样我就不必每次添加表时都维护 env.py 。我将其添加到数据库模块中的 models.py 中,仅此而已。