【问题标题】:Why did I have problems with alembic migrations为什么我在使用 Alembic 迁移时遇到问题
【发布时间】:2018-02-13 11:12:42
【问题描述】:

项目结构(只有数据库迁移的目录):

--db_manage:
  alembic.ini
  --alembic:
    env.py
    script.py.mako
    README
    --versions:
      #migration files

当我尝试运行命令:python db_manage/alembic/env.py 时,我得到如下响应:

Traceback (most recent call last):
  File "db_manage/alembic/env.py", line 8, in <module>
    config = context.config
AttributeError: module 'alembic.context' has no attribute 'config'

在什么情况下我会遇到这个问题?
P.S.
档案alembic.ini

# A generic, single database configuration.

[alembic]
# path to migration scripts
script_location = alembic

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

# max length of characters to apply to the
# "slug" field
#truncate_slug_length = 40

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

# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false

# version location specification; this defaults
# to numus/versions.  When using multiple version
# directories, initial revisions must be specified with --version-path
# version_locations = %(here)s/bar %(here)s/bat numus/versions

# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8

sqlalchemy.url = postgresql://test:oe50yxXOspYDsaXSO7Gf@localhost/test


# 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

文件env.py

from __future__ import with_statement
from alembic import context
from sqlalchemy import engine_from_config, pool
from logging.config import fileConfig

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config

# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = None

# other values from the config, defined by the needs of env.py,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.


def run_migrations_offline():
    """Run migrations in 'offline' mode.

    This configures the context with just a URL
    and not an Engine, though an Engine is acceptable
    here as well.  By skipping the Engine creation
    we don't even need a DBAPI to be available.

    Calls to context.execute() here emit the given string to the
    script output.

    """
    url = config.get_main_option("sqlalchemy.url")
    context.configure(
        url=url, target_metadata=target_metadata, literal_binds=True)

    with context.begin_transaction():
        context.run_migrations()


def run_migrations_online():
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix='sqlalchemy.',
        poolclass=pool.NullPool)

    with connectable.connect() as connection:
        context.configure(
            connection=connection,
            target_metadata=target_metadata
        )

        with context.begin_transaction():
            context.run_migrations()

if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

【问题讨论】:

  • 试试python db_manage/alembic/env.py --autogenerate
  • @Mekicha 没有改变,输出相同
  • 您似乎是从与alembic.ini 所在的目录不同的目录运行命令。尝试使用-c--config 显式传递它,如alembic --config db_manage/alembic.ini ...。不确定这是否是根本原因,但值得一试。
  • @IljaEverilä 据我了解,我应该在db_manage/ 目录中运行该命令?
  • 如果我正确理解了情况,那也会有所帮助。更不用说据我所知,您不应该直接自己运行env.py,而是使用alembic 迁移工具,然后运行您的env.py

标签: python flask sqlalchemy alembic


【解决方案1】:

您尝试调用迁移工具的方式有两处错误。首先,您应该使用alembic 脚本,而不是尝试直接运行env.py。来自tutorial

env.py - 这是一个 Python 脚本,在调用 alembic 迁移工具时运行。至少,它包含配置和生成 SQLAlchemy 引擎的指令,从该引擎获取连接以及事务,然后调用迁移引擎,使用该连接作为数据库连接源。

其次,尽管您可以将alembic.ini 保留在任何地方,但默认行为是在当前目录中查找:

Alembic 将文件 alembic.ini 放入当前目录。这是alembic 脚本在调用时查找的文件。该文件可以位于任何位置,可以在通常调用alembic 脚本的同一目录中,或者如果在不同目录中,可以使用alembic 运行器的--config 选项来指定。

因此,如果它在其他地方举行,您必须使用-c--config 开关告知alembic 该位置。例如:

alembic --config db_manage/alembic.ini

【讨论】:

  • 它对我帮助很大,但现在我遇到了新问题:我的凭据错误,当我尝试运行 alembic upgrade head 时,它告诉我我的数据库密码错误。哪里可以改?附言对不起,愚蠢的问题,我是 python 新手,并尝试设置现有项目。
  • sqlalchemy.url 中的alembic.ini 是处理这个问题的地方。如果需要,还要检查您的 Postgresql 配置是否允许在 pg_hba.conf 中使用所需的身份验证方法。
  • @CharlieOConor 因为你没有问。取而代之的是,您写了一篇完全超出此特定 Q/A 要点的长篇大论,我假设其他负面反馈与咆哮相伴。
  • @CharlieOConor 现在您是否要提出一个适当的问题来详细说明您的实际问题,而不是仅仅发泄一下,那么也许熟悉alembic API 的人会想出一个解决方案。
  • 对于它的价值,你确实有道理。我认为“两全其美”的解决方案是具有通常情况下的命令行和配置的工具,并由实现逻辑的库支持。
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2019-10-07
  • 2020-11-01
  • 2015-12-04
  • 2011-07-21
  • 2012-11-20
相关资源
最近更新 更多