在使用Python和Flask部署到Heroku时,PostgreSQL表格没有被更新。
在使用Python和Flask部署到Heroku时,PostgreSQL表格没有被更新。
我成功地在Heroku上部署了一个使用Python和Flask构建的应用程序。在本地,用户注册和身份验证按预期工作。然而,当我尝试在部署的应用程序上注册或登录时,heroku logs --tail
显示以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) 关系"user"不存在 2020-10-04T05:30:18.432952+00:00 app[web.1]: 第2行:FROM "user" 2020-10-04T05:30:18.432952+00:00 app[web.1]: ^ 2020-10-04T05:30:18.432953+00:00 app[web.1]: 2020-10-04T05:30:18.432953+00:00 app[web.1]: [SQL: SELECT "user".id AS user_id, "user".username AS user_username, "user".email AS user_email, "user".password_hash AS user_password_hash, "user".about_me AS user_about_me, "user".last_seen AS user_last_seen 2020-10-04T05:30:18.432954+00:00 app[web.1]: FROM "user" 2020-10-04T05:30:18.432954+00:00 app[web.1]: WHERE "user".username = %(username_1)s 2020-10-04T05:30:18.432954+00:00 app[web.1]: LIMIT %(param_1)s] 2020-10-04T05:30:18.432955+00:00 app[web.1]: [parameters: {'username_1': 'harry', 'param_1': 1}] 2020-10-04T05:30:18.432960+00:00 app[web.1]: (关于此错误的更多信息:http://sqlalche.me/e/f405)
因此,我查看了我的数据库的状态,并注意到我的数据库中的表(我有用户和帖子)没有更新。我运行了以下命令:
$ heroku pg:info DATABASE === DATABASE_URL 计划:Hobby-dev 状态:可用 连接数:1/20 PG版本:12.4 创建时间:2020-10-05 01:07 UTC 数据大小:7.9 MB 表:0 行:0/10000(符合规定) 分叉/跟随:不支持 回滚:不支持 连续保护:关闭 插件:postgresql-solid-77130
我的本地数据库是SQLite,它将数据保存在我的本地磁盘上。我按照Heroku的建议切换到PostgreSQL
,通过添加插件成功创建了一个DATABASE_URL
。当我比较终端结果与Heroku仪表板上的插件概述时,可以确认数据库URL:
$ heroku config:get DATABASE_URL
此时,我已经有了DATABASE_URL
。为了更新我的数据库,我运行了以下命令:
$ heroku run flask db upgrade
这应该更新我的表,但实际上没有。相反,我收到了以下错误:
Traceback (most recent call last): File "/app/.heroku/python/bin/flask", line 8, insys.exit(main()) File "/app/.heroku/python/lib/python3.6/site-packages/flask/cli.py", line 967, in main cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None) File "/app/.heroku/python/lib/python3.6/site-packages/flask/cli.py", line 586, in main return super(FlaskGroup, self).main(*args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 782, in main rv = self.invoke(ctx) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 1066, in invoke return ctx.invoke(self.callback, **ctx.params) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/click/decorators.py", line 21, in new_func return f(get_current_context(), *args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/flask/cli.py", line 426, in decorator return __ctx.invoke(f, *args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/flask_migrate/cli.py", line 134, in upgrade _upgrade(directory, revision, sql, tag, x_arg) File "/app/.heroku/python/lib/python3.6/site-packages/flask_migrate/__init__.py", line 96, in wrapped f(*args, **kwargs) File "/app/.heroku/python/lib/python3.6/site-packages/flask_migrate/__init__.py", line 271, in upgrade command.upgrade(config, revision, sql=sql, tag=tag) File "/app/.heroku/python/lib/python3.6/site-packages/alembic/command.py", line 298, in upgrade script.run_env() File "/app/.heroku/python/lib/python3.6/site-packages/alembic/script/base.py", line 489, in run_env util.load_python_file(self.dir, "env.py") File "/app/.heroku/python/lib/python3.6/site-packages/alembic/util/pyfiles.py", line 98, in load_python_file module = load_module_py(module_id, path) File "/app/.heroku/python/lib/python3.6/site-packages/alembic/util/compat.py", line 184, in load_module_py spec.loader.exec_module(module) File " ", line 678, in exec_module File " ", line 219, in _call_with_frames_removed File "migrations/env.py", line 27, in str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) AttributeError: 'NoneType' object has no attribute 'engine'
我认为升级是问题所在,因此出现了错误AttributeError: 'NoneType' object has no attribute 'engine'
我该如何解决这个问题?
我尝试过:
$ heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi
...将占位符替换为我的值,但仍然不起作用。Stack Overflow上有其他类似的与数据库相关的问题,例如这个和这个,但没有一个真正回答了我的问题。
在Heroku部署中,使用Python和Flask时,PostgreSQL表没有更新的问题的出现原因是在应用工厂中,初始化迁移时忘记添加"db"参数。只需要将"db"添加到初始化迁移的参数中即可。
最初的代码如下:
def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) login.init_app(app) db.init_app(app) migrate.init_app(app) #<--------------- moment.init_app(app) babel.init_app(app) mail.init_app(app) bootstrap.init_app(app)
修复后的代码如下:
def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) login.init_app(app) db.init_app(app) migrate.init_app(app, db) #<--------------- moment.init_app(app) babel.init_app(app) mail.init_app(app) bootstrap.init_app(app)
现在,当运行"python heroku run flask db upgrade"命令时,PostgreSQL表会被更新,并且可以看到它们。感谢这篇帖子的帮助。