python - 使用 alembic 迁移时本地和 heroku 数据库不同步

标签 python sqlalchemy migration flask alembic

我正在使用托管在 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/

相关文章:

python - 振幅和相位谱。改变相位,保持振幅不变

python - 如果满足 m 个条件中的任何 n 个,则为 Pandas

entity-framework - 如何完全删除添加新表的EF迁移

python - SQLAlchemy 'Comparator' 对象没有属性 'has_key'

python - 使用 SQLAlchemy Postgres 批量更新插入

java - Apache poi迁移到jdk 11问题

mysql - Rails 迁移问题 - 未创建外键

python - 为什么 SymPy 无法求解具有复杂系数的二次方程

python - tkinter.TclError : couldn't connect to display "localhost:18.0"

sqlalchemy - sqlalchemy:Base如何知道我已经定义了映射到它的类?