我在 Heroku 上的 Postgresql 数据库和 Python/Django Rest Framework 项目的 PostGIS 扩展上遇到了以下问题。 当尝试发布应用程序时,我收到以下错误:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.11/site-packages/django/db/backends/utils.py", line 82, in _execute
return self.cursor.execute(sql)
^^^^^^^^^^^^^^^^^^^^^^^^
psycopg2.errors.UndefinedTable: relation "public.spatial_ref_sys" does not exist
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/app/manage.py", line 28, in <module>
execute_from_command_line(sys.argv)
File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/app/.heroku/python/lib/python3.11/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
(…)
File "/app/.heroku/python/lib/python3.11/site-packages/django/db/backends/utils.py", line 82, in _execute
return self.cursor.execute(sql)
^^^^^^^^^^^^^^^^^^^^^^^^
django.db.utils.ProgrammingError: relation "public.spatial_ref_sys" does not exist
据我了解,问题是由于 PostGIS 扩展(及其表
spatial_ref_sys
)预计处于公共架构中,同时,根据以前的标准,它处于 heroku_ext
中。然而,目前,根据本文,扩展安装在模式
public
中,并且发布过程要求它们安装在模式public
中。
但是,我尝试将 PostGIS 扩展从
heroku_ext
移动到 public
没有成功。调用命令:
ALTER extension postgis SET SCHEMA public;
我收到错误:
ERROR: must be owner of extension postgis
在本文中,Heroku 支持指出:
启用 Heroku 数据实验室功能后,您可以重新安装或将扩展重新定位到您想要的任何架构。启用后,未来的扩展将使其类型和功能转到适当的模式(通常是
),并且不会添加任何新内容到public
。heroku_ext
但是,这个解决方案不起作用,因为命令:
heroku data:labs:enable extensions-on-any-schema --addon {OUR_DATABASE_URL} -a {OUR_APP_NAME}
(当然是用数据库 URL 和应用程序名称完成的)返回错误:
' Error: Couldn't find that add on.
' Error ID: not_found
如何将 PostGIS 扩展转移到
public
模式?如果没有这个,我们将无法发布下一版本的应用程序。
Stack Overflow 上描述了一些解决方法,但是,它们需要清空数据库,在这种情况下这是不可能的,因为这是一个生产应用程序,并且再次导入所有数据几乎是不可能的。
就这个问题联系 Heroku 支持团队后,发现根本原因是 Heroku 本身的错误。支持团队解决了该错误并对我的数据库进行了维护。由于我使用的是基本层数据库,它不允许手动维护,因此他们的干预是必要的。经过这些操作,问题得到解决。
对于那些遇到类似问题的人,我建议对数据库进行维护作为潜在的解决方案。但是,如果您的数据库位于 Essential 层并且手动维护不可行,最好的方法是联系 Heroku 支持寻求帮助并要求他们执行维护。