我正在使用托管在 heroku 上的 Flask 和 Angular 构建一个应用程序。我在迁移 heroku postgresql 时遇到问题。我正在使用 flask-migrate这是 alembic 的一个小包装。在本地一切都很好。当我运行运行 alembic upgrade 命令的 heroku run 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' {}
简单地说,alembic 试图从创建数据库的第一个迁移开始运行。我尝试使用 heroku run python manage.py db upgrade +2
或修订号明确设置正确的修订版,但异常(exception)是相同的。
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
我的猜测是由于 Heroku 修订版的临时文件系统未存储,但如果我明确设置修订版,那应该不是问题,对吧? :)
如何设置当前的修订负责人?
相关代码如下:
简介:
web: gunicorn server:app
init: python manage.py db init
upgrade: python manage.py db upgrade
模型.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)
最佳答案
您放入 Procfile
中的 init
命令会创建一个全新的 Alembic 存储库,这是您在开发机器上只需执行一次的操作。当您部署到一台新机器时,您需要做的就是运行 upgrade
命令来创建数据库并将其更新到最新版本。
Alembic 和 Flask-Migrate 有一个名为 stamp
的命令可以帮助您解决这个问题。使用 stamp
,您可以告诉 Alembic 将您选择的修订写入数据库,而无需触及数据库本身。
例如,如果 Alembic 必须一个接一个地完成所有迁移,那么在有大量迁移时从头开始创建数据库可能会花费很长时间。相反,您可以使用 db.create_all()
创建数据库,然后运行:
$ ./manage.py db stamp HEAD
数据库被标记为已更新。
此外,在某些时候我赞成将维护命令放在 Procfile
中的想法,但现在我只将服务放在那里,所以我只会离开 web
在那里排队。要升级数据库,我认为显式运行命令更可预测:
$ heroku run python manage.py db upgrade
关于python - 使用 alembic 迁移时本地和 heroku 数据库不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20920939/