我在带有 Postgresql 后端的 Flask 应用程序中使用 Flask-Migrate。问题是,在对我的模型进行更改后,比如添加或删除列,在我尝试过的任何修订或迁移中,我总是得到以下结果
INFO [alembic.autogenerate.compare] Detected added table u'foo'
并且其中的每个脚本都migrations/versions
包含用于创建表的代码,例如
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('foo',
...
)
### end Alembic commands ###
我期待类似的东西
INFO [alembic.autogenerate.compare] Detected added column u'foo.name'
和
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column('foo', sa.Column('name', ...
)
### end Alembic commands ###
我正在按照此博客中的说明进行操作。相关设置如下:
### __init__.py
import ...
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
db.metadata.schema = app.config['DB_SCHEMA']
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
...
import myapp.models
### models.py
from myapp import db
class Foo(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(50), nullable=False)
我遵循了这些问题中给出的一些建议:(Alembic/Flask-migrate 无法识别数据库结构)和(在使用 Flask-SQLAlchemy 进行迁移的 Alembic 自动生成中未检测到任何变化),但没有任何运气。
知道我做错了什么吗?
提前致谢。
解决了
我刚刚发现了问题。我喜欢使用数据库模式,我正在这样做
db.metadata.schema = app.config['DB_SCHEMA']
似乎alembic
不知何故不知道模式的固有范围,因此它一直在重新创建表。有点:没有表foo
- 在最外面的全局“模式”或范围内 - 所以我必须到create
那个表。即使在第一次迁移正确创建表之后,这种情况也会发生。当然,不出所料地执行了第二次迁移
sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "foo" already exists
我刚刚放弃了上面的声明,现在我看到了正确的变化。
INFO [alembic.autogenerate.compare] Detected added column 'foo.name'
我不知道我是否必须做一些特别的事情来支持计划。也许这只是一个不受支持的功能。