gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:07:19 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com