失败:找不到配置文件'alembic.ini'

Lin*_*nda 12 python alembic

我试图改变Alembic但是当我尝试运行Alembic时我得到了错误.我是alembic的新手,请告诉我为什么我会收到此错误,我该如何解决?

我可以alembic.ini在迁移文件夹和Alembic使用的修订标识符中看到,一切似乎都很好.

$alembic current
No handlers could be found for logger "alembic.util"
  FAILED: No config file 'alembic.ini' found, or file has no '[alembic]' section
Run Code Online (Sandbox Code Playgroud)

20c921506336_.py:

"""empty message

Revision ID: 20c921506336
Revises: None
Create Date: 2015-01-30 16:28:38.981023

"""

# revision identifiers, used by Alembic.
revision = '20c921506336'
down_revision = None

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('user',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=50), nullable=True),
    sa.Column('email', sa.String(length=50), nullable=True),
    sa.Column('age', sa.Integer(), nullable=True),
    sa.Column('bestfriend_id', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['bestfriend_id'], ['user.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(u'ix_user_age', 'user', ['age'], unique=True)
    op.create_index(u'ix_user_email', 'user', ['email'], unique=True)
    op.create_index(u'ix_user_name', 'user', ['name'], unique=True)
    op.create_table('friends',
    sa.Column('user_id', sa.Integer(), nullable=True),
    sa.Column('friend_id', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['friend_id'], ['user.id'], ),
    sa.ForeignKeyConstraint(['user_id'], ['user.id'], )
    )
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('friends')
    op.drop_index(u'ix_user_name', table_name='user')
    op.drop_index(u'ix_user_email', table_name='user')
    op.drop_index(u'ix_user_age', table_name='user')
    op.drop_table('user')
    ### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 8

您必须cd到具有alembic.ini运行alembic命令的目录,即alembic.ini必须在当前工作目录中找到; 或者您可以使用指定配置文件位置alembic -c path/to/alembic.ini.

似乎你的alembic ini坏了,你应该script_location在那里,因此如果你的迁移在alembic子目录中,alembic.ini应该读取如下内容:

[alembic]
script_location = alembic

# 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)

目录布局必须是这样,如果你的script_location = alembic意思是你有:

alembic.ini
alembic/   # this must match the script_location in alembic.ini
    env.py   # and this must be found at the script_location
    script.py.mako
    versions/
        20c921506336_.py
Run Code Online (Sandbox Code Playgroud)


Kob*_*ohn 8

对于执行以下操作的部署脚本:

ssh ... alembic upgrade head

Antii的答案提供了直接答案,即-c选项:

ssh ... alembic -c /path/to/alembic.ini upgrade head

但是,然后您可能会变得像我一样:

FAILED: Path doesn't exist: 'alembic'. Please use the 'init' command to create a new scripts folder.

蒸馏器是无法解释你的意图script_locationalembic.ini。通常,您从目录使用alembic.inialembic 运行,并且alembic能够将您解释script_location为相对路径。

但是,当您使用简单的部署脚本或从其他目录运行它时,它不知道在哪里查找,并且不使用目录alembic.ini来猜测位置(正如我认为Antii所建议的那样)。

如果在这里查看alembic源代码,您会看到alembic想要1)绝对路径,2)软件包路径或3)来自工作目录的相对路径(默认情况)。

因此,此答案的第二层是

选项1:绝对路径

(我还没有测试过!)在中提供Alembic目录的绝对路径alembic.ini。这对我不起作用,因为代码变得不可移植:

...
script_location = /path/to/alembic/
...
Run Code Online (Sandbox Code Playgroud)

选项2:打包路径

在以下位置提供打包路径alembic.ini

...
script_location = rootpackage:alembic  # or maybe rootpacakge.xyz:alembic
...
Run Code Online (Sandbox Code Playgroud)

当然,它实际上必须是一个包装,因此的位置alembic.ini必须有__init__.py

选项3:相对路径

而不是直接在您的部署脚本中运行alembic升级,而是将bash脚本制作到cd正确的目录,然后运行它。

  • 很好的答案。对于相对路径问题,请使用 docker 或其他虚拟环境解决方案来实现跨机器可移植性。 (2认同)