使用alembic迁移时,Local和heroku db不同步

Luk*_*don 6 python migration sqlalchemy flask alembic

我正在使用Flask和Angular在heroku上托管应用程序.我有迁移heroku postgresql的问题.我正在使用flask-migrate,这是一个围绕着alembic的小包装.当地一切都很好.当我运行heroku run upgrade运行alembic upgrade命令时,我遇到了异常.

INFO  [alembic.migration] Context impl PostgresqlImpl.
INFO  [alembic.migration] Will assume transactional DDL.
INFO  [alembic.migration] Running upgrade None -> 19aeffe4063d, empty message
Traceback (most recent call last):
  File "manage.py", line 13, in <module>
    manager.run()
...

   cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "users" already exists
 '\nCREATE TABLE users (\n\tid SERIAL NOT NULL, \n\tusername VARCHAR(32), \n\tpassword_hash VARCHAR(128), \n\tPRIMARY KEY (id)\n)\n\n' {}
Run Code Online (Sandbox Code Playgroud)

简单地说,alembic试图从创建db的第一次迁移中运行.我尝试使用heroku run python manage.py db upgrade +2或修订号明确设置正确的修订,但异常是相同的.

lukas$ heroku run python manage.py db current
Running `python manage.py db current` attached to terminal... up, run.1401
INFO  [alembic.migration] Context impl PostgresqlImpl.
INFO  [alembic.migration] Will assume transactional DDL.
Current revision for postgres://...: None
Run Code Online (Sandbox Code Playgroud)

我的猜测是由于没有存储Heroku修订版的短暂文件系统,但如果我明确设置修订版,这应该不是问题,对吧?:)

如何设置当前的修订头?

这是相关代码:

Procfile:

web: gunicorn server:app
init: python manage.py db init
upgrade: python manage.py db upgrade
Run Code Online (Sandbox Code Playgroud)

models.py

db = SQLAlchemy()

ROLE_USER = 0
ROLE_ADMIN = 1


class User(db.Model):
  __tablename__ = "users"
  id = db.Column(db.Integer, primary_key = True)
  username = db.Column(db.String(32), unique = True, index = True)
  email = db.Column(db.String(255), unique = True)
  password_hash = db.Column(db.String(128))
  role = db.Column(db.SmallInteger, default = ROLE_USER)
Run Code Online (Sandbox Code Playgroud)

Mig*_*uel 4

init您输入的命令会创建一个Procfile全新的 Alembic 存储库,您只需在开发计算机上执行一次该操作。当您部署到新计算机时,您所需要做的就是运行命令upgrade来创建数据库并将其更新到最新版本。

Alembic 和 Flask-Migrate 有一个名为 的命令stamp可以帮助您解决此问题。您可以stamp告诉 Alembic 将您选择的修订版本写入数据库,而无需触及数据库本身。

例如,当有大量迁移时,如果 Alembic 必须一项一项地完成所有迁移,则从头开始创建数据库可能会花费很长时间。相反,您可以使用以下命令创建数据库db.create_all(),然后运行:

$ ./manage.py db stamp HEAD
Run Code Online (Sandbox Code Playgroud)

这样数据库就被标记为已更新。

另外,在某些时候我赞成将维护命令放在 中的想法Procfile,但现在我只将服务放在那里,所以我只会将线路留在那里web。要升级数据库,我认为显式运行命令更可预测:

$ heroku run python manage.py db upgrade
Run Code Online (Sandbox Code Playgroud)