簡體   English   中英

如何解決 heroku 上的應用程序錯誤?

[英]How can I solve application error on heroku?

我正在嘗試在 django 上創建一個應用程序,並試圖在 heroku 上托管它。一切都在本地完美運行。 嘗試通過運行命令將數據庫遷移到 heroku 應用程序時出現錯誤 -

heroku run python manage.py migrate

這是我得到的錯誤 -

Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 230, in ensure_connection
    self.connect()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 211, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 199, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/app/.heroku/python/lib/python3.9/site-packages/psycopg2/__init__.py", line 121, in connect
    dsn = _ext.make_dsn(dsn, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/psycopg2/extensions.py", line 167, in make_dsn
    parse_dsn(dsn)
psycopg2.ProgrammingError: invalid dsn: invalid connection option "init_command"


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/manage.py", line 22, in <module>
    main()
  File "/app/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/__init__.py", line 425, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 373, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 417, in execute
    output = self.handle(*args, **options)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 90, in wrapped
    res = handle_func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 75, in handle
    self.check(databases=[database])
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/management/base.py", line 438, in check
    all_issues = checks.run_checks(
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/checks/registry.py", line 77, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/core/checks/model_checks.py", line 34, in check_all_models
    errors.extend(model.check(**kwargs))
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/base.py", line 1307, in check
    *cls._check_indexes(databases),
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/models/base.py", line 1699, in _check_indexes
    connection.features.supports_covering_indexes or
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/postgresql/features.py", line 84, in is_postgresql_11
    return self.connection.pg_version >= 110000
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 339, in pg_version
    with self.temporary_connection():
  File "/app/.heroku/python/lib/python3.9/contextlib.py", line 119, in __enter__
    return next(self.gen)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 614, in temporary_connection
    with self.cursor() as cursor:
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 270, in cursor
    return self._cursor()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 246, in _cursor
    self.ensure_connection()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 230, in ensure_connection
    self.connect()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 230, in ensure_connection
    self.connect()
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/base/base.py", line 211, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/utils/asyncio.py", line 25, in inner
    return func(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 199, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/app/.heroku/python/lib/python3.9/site-packages/psycopg2/__init__.py", line 121, in connect
    dsn = _ext.make_dsn(dsn, **kwargs)
  File "/app/.heroku/python/lib/python3.9/site-packages/psycopg2/extensions.py", line 167, in make_dsn
    parse_dsn(dsn)
django.db.utils.ProgrammingError: invalid dsn: invalid connection option "init_command"

設置.py -

prod_db  =  dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(prod_db)

settings.py(數據庫部分)-

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '****',
        'USER': '****',
        'PASSWORD': '****',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}
        

我該如何解決這個問題? 請詢問我是否需要將我的任何文件添加到問題中。

您在本地開發中使用MySQL ,在生產中使用 PostgreSQL。 PostgreSQL 連接來自dj_database_url默認使用的DATABASE_URL環境變量。

由於您是從環境更新默認數據庫(而不是替換它),因此 PostgreSQL 配置中保留了 MySQL 特定的init_command選項。 psycopg2 PostgreSQL 驅動程序不知道如何處理它。

一個快速而骯臟的解決方案是完全使用默認數據庫配置而不是更新它:

DATABASES['default'] = prod_db

但我強烈建議您使用同一台數據庫服務器進行開發和生產。 正如您所發現的,數據庫引擎並不是彼此的直接替代品。 在這種情況下,在 Heroku 上從 PostgreSQL 切換到 MySQL 可能是最簡單的。

首先,讓我們擺脫 Postgres 的東西:

  • 從依賴項中刪除psycopg2 它的存在可能導致 Heroku 自動為您提供一個 PostgreSQL 數據庫,這增加了混亂。
  • 或者,取消供應現有的 Postgres 數據庫。 它可能是免費版本,因此不會花費您任何費用,但如果您使用的是完全不同的數據庫服務器,那么讓它閑逛有點奇怪。

現在,提供一個 MySQL 服務器。 我建議您從可用的插件中挑選。 有幾個 MySQL 選項,包括 JawsDB 和 ClearDB。 這是一個使用 ClearDB 的示例

heroku addons:create cleardb:ignite

Ignite 是 ClearDB 的免費層。 配置后,您的應用程序將看到一個新的環境變量CLEARDB_DATABASE_URL 其他插件將使用其他環境變量名稱,因此請務必閱讀它們的文檔。

最后,更新您的 Django 配置。 dj_database_url默認使用DATABASE_URL環境變量,但我們可以告訴它使用另一個

prod_db = dj_database_url.config(env="CLEARDB_DATABASE_URL", conn_max_age=500)
DATABASES['default'].update(prod_db)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM