【发布时间】:2014-01-22 03:26:37
【问题描述】:
我正在使用托管在 heroku 上的 Flask 和 Angular 构建一个应用程序。我在迁移 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' {}
简单地说,alembic 正在尝试从创建数据库的第一个迁移中运行。我尝试使用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
我的猜测是,由于 Heroku 修订版的临时文件系统未存储,但如果我明确设置修订版,这应该不是问题,对吧? :)
如何设置当前的修订头?
这里是相关代码:
过程文件:
web: gunicorn server:app
init: python manage.py db init
upgrade: python manage.py db upgrade
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)
【问题讨论】:
-
不确定这是否是实际问题,但是当您转到 heroku 时,您不需要使用
init,因为这是创建新存储库的命令。您需要做的就是升级命令。
标签: python sqlalchemy migration flask alembic