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)
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)
| 归档时间: |
|
| 查看次数: |
894 次 |
| 最近记录: |