Как изменить пользователя postgres по умолчанию на django, развернутом в стандартной среде app engine?

У меня есть проект, использующий django, который развернут в стандартной среде app engine. Когда я использую cloud_sql_proxy.exe для makemigrations на django, появляется следующая ошибка :

(venv) G:\John Drive\Python\Project\My Project>python manage.py makemigrations
G:\John Drive\Python\Project\venv\lib\site-packages\django\core\management\commands\makemigrations.py:105: RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': connection to server at "localhost" (::1), port 5432 failed: Connection refused (0x0000274D/10061)
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL:  password authentication failed for user "postgres"

warnings.warn(
No changes detected

Это мой settings.py

# [START gaestd_py_django_secret_config]
env = environ.Env(DEBUG=(bool, False))
env_file = os.path.join(BASE_DIR, ".env")

if os.path.isfile(env_file):
    # Use a local secret file, if provided

    env.read_env(env_file)
# [START_EXCLUDE]
elif os.getenv("TRAMPOLINE_CI", None):
    # Create local settings if running with CI, for unit testing

    placeholder = (
        f"SECRET_KEY=a\n"
        f"DATABASE_URL=sqlite://{os.path.join(BASE_DIR, 'db.sqlite3')}"
    )
    env.read_env(io.StringIO(placeholder))
# [END_EXCLUDE]
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
    # Pull secrets from Secret Manager
    project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")

    client = secretmanager.SecretManagerServiceClient()
    settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
    name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
    payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")

    env.read_env(io.StringIO(payload))
else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")
# [END gaestd_py_django_secret_config]

# Database
# [START db_setup]
# [START gaestd_py_django_database_config]
# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set, configure to use proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# [END gaestd_py_django_database_config]
# [END db_setup]

# Use a in-memory sqlite3 database when testing in CI systems
# TODO(glasnt) CHECK IF THIS IS REQUIRED because we're setting a val above
if os.getenv("TRAMPOLINE_CI", None):
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.sqlite3",
            "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
        }
    }

Вот мой .env файл :

DATABASE_URL=postgres://myproject:project123@//cloudsql/myproject-676524:asia-southeast1:myproject/myproject-db
GS_BUCKET_NAME=myproject-676524_myproject
SECRET_KEY=secret123

Если вы посмотрите на конфигурацию в файле .env, я использую пользователя myproject вместо пользователя postgres, в то время как ошибка выше говорит password authentication failed for user "postgres"

Как изменить пользователя по умолчанию postgres на пользователя myproject?

Ваша конфигурация выглядит правильной, я бы предложил попробовать добавить несколько утверждений print к settings.py, чтобы вы могли увидеть, что на самом деле происходит при запуске программы, и сузить возможные причины ошибки. Некоторые вещи, которые вы могли бы проверить:

  • Какие данные на самом деле присутствуют в env? Я бы проверил это как после инициализации с помощью environ.Env(..), так и после чтения файла .env с помощью env.read_env(env_file).

  • Какие из их ветвей выполняются? Например, найден ли файл .env при вызове os.path.isfile(env_file)? Я бы добавил оператор печати к каждой из ветвей if, чтобы проверить, какие из них выполняются, и посмотреть, соответствует ли это вашим ожиданиям.

  • Какие данные попадают в DATABASES["default"]? Опять же, я бы проверил это дважды, один раз после вызова env.db(), и еще раз после установки HOST и PORT, если USE_CLOUD_SQL_AUTH_PROXY установлен.

В итоге я удалил/реклонировал репо и эта ошибка исчезла, не знаю почему, но ошибки больше нет

Вернуться на верх