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 ###
次のようなことを行うデプロイスクリプトの場合:
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_location
のalembic.ini
に対するあなたの意図を解釈できません。通常、alembic.ini
のあるディレクトリからalembicを実行すると、alembicはscript_location
を相対パスとして解釈できます。
ただし、単純なデプロイスクリプトを使用するか、別のディレクトリから実行すると、どこを探すべきかわからず、alembic.ini
のディレクトリを使用して場所を推測しません(Antiiが提案したように?) 。
Alembicのソースコードを見ると ここ 、alembicが1)絶対パス、2)パッケージパス、または3)作業ディレクトリからの相対パス(デフォルトの場合)のいずれかを必要としていることがわかります。 。
したがって、この答えの2番目のレベルは
(私はこれをテストしていません!)alembic.ini
のalembicディレクトリへの絶対パスを指定します。コードが移植できなくなるため、これは私には機能しません。
...
script_location = /path/to/alembic/
...
alembic.ini
にパッケージパスを指定します。
...
script_location = rootpackage:alembic # or maybe rootpacakge.xyz:alembic
...
もちろん、実際にはパッケージである必要があるため、alembic.ini
のある場所には__init__.py
が必要です。
デプロイスクリプトで直接alembicアップグレードを実行する代わりに、適切なディレクトリのcd
にbashスクリプトを作成して実行します。
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