我已经成功地在Heroku中部署了一个应用程序,我使用Python和Flask构建。在本地,用户注册和身份验证按预期工作。但是,当我尝试注册或甚至登录到部署的应用程序时,heroku logs--ail显示此错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "user" does not exist
2020-10-04T05:30:18.432952+00:00 app[web.1]: LINE 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]: (Background on this error at: http://sqlalche.me/e/f405)
因此,我查看了数据库的状态,并注意到数据库中的表(我有用户和帖子)没有更新。我跑了:
$ heroku pg:info DATABASE
=== DATABASE_URL
Plan: Hobby-dev
Status: Available
Connections: 1/20
PG Version: 12.4
Created: 2020-10-05 01:07 UTC
Data Size: 7.9 MB
Tables: 0
Rows: 0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-solid-77130
我的本地数据库是SQLite,它将数据保存在本地磁盘上。我切换到PostgreSQL
作为推荐我的Heroku得到一个插件,并成功地创建了一个DATABASE_URL
。当我比较我的终端结果时,我可以确认数据库URL:
$ heroku config:get DATABASE_URL
在Heroku仪表板上的插件概述中显示。此时,我有了数据库的URL
。要更新我的数据库,我运行:
$ heroku run flask db upgrade
这应该会更新我的表,但不会。相反,我得到了一个错误:
Traceback (most recent call last):
File "/app/.heroku/python/bin/flask", line 8, in <module>
sys.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 "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "migrations/env.py", line 27, in <module>
str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%'))
AttributeError: 'NoneType' object has no attribute 'engine'
我认为升级就是问题所在,因此出现错误AttributeError:'NoneType'对象没有属性'engine'
我怎样才能解决这个问题?
我试过:
$ heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi
...用我自己的价值观替换占位符,但它仍然不起作用。SO还有其他类似的数据库相关问题,比如这个和这个,但是没有一个真正回答我的问题。
我已经找到了一个解决办法。查看我的应用程序工厂,在初始化migrate
时,我没有添加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时,PostreSQL表被更新,我可以看到它们。感谢来到这个岗位。