web-dev-qa-db-ja.com

失敗:構成ファイル 'alembic.ini'が見つかりません

Alembicで変更しようとしましたが、Alembiccurrentを実行しようとするとエラーが発生しました。私はアレムビックを初めて使用します。なぜこのエラーが発生するのか、どうすれば解決できますか?

私は見えます 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

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 ###
13
Linda

次のようなことを行うデプロイスクリプトの場合:

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.

Alembicは、script_locationalembic.iniに対するあなたの意図を解釈できません。通常、alembic.iniのあるディレクトリからalembicを実行すると、alembicはscript_locationを相対パスとして解釈できます。

ただし、単純なデプロイスクリプトを使用するか、別のディレクトリから実行すると、どこを探すべきかわからず、alembic.iniのディレクトリを使用して場所を推測しません(Antiiが提案したように?) 。

Alembicのソースコードを見ると ここ 、alembicが1)絶対パス、2)パッケージパス、または3)作業ディレクトリからの相対パス(デフォルトの場合)のいずれかを必要としていることがわかります。 。

したがって、この答えの2番目のレベルは

オプション1:絶対パス

(私はこれをテストしていません!)alembic.iniのalembicディレクトリへの絶対パスを指定します。コードが移植できなくなるため、これは私には機能しません。

...
script_location = /path/to/alembic/
...

オプション2:パッケージパス

alembic.iniにパッケージパスを指定します。

...
script_location = rootpackage:alembic  # or maybe rootpacakge.xyz:alembic
...

もちろん、実際にはパッケージである必要があるため、alembic.iniのある場所には__init__.pyが必要です。

オプション3:相対パス

デプロイスクリプトで直接alembicアップグレードを実行する代わりに、適切なディレクトリのcdにbashスクリプトを作成して実行します。

8
KobeJohn

cdコマンドを実行するには、alembic.iniがあるディレクトリにalembicする必要があります。つまり、alembic.iniは現在の作業ディレクトリにある必要があります。または、alembic -c path/to/alembic.iniを使用して構成ファイルの場所を指定できます。

また、アレムビック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

ディレクトリレイアウト必須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
8
Antti Haapala