Как обновить старое Django приложение Google App Engine до экземпляра второго поколения Cloud SQL? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть приложение Django, которое я написал 5 лет go, которое успешно работало в Google App Engine - до прошлого месяца, когда Google перешел на Облако второго поколения SQL.

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

DATABASES = {
    'default': {
        'ENGINE': 'google.appengine.ext.django.backends.rdbms',
        'INSTANCE': 'my-project-name:my-db-instance',
        'NAME': 'my-db-name',
    },

Руководство по обновлению Google , сообщает, что имя соединения необходимо изменить с ' my-project-name: my-db-instance 'to' my-project-name: my-region: my-db-instance '. Это достаточно просто. Изменение этого приводит меня к ошибке

InternalError at / login /

(0, у вас нет прав доступа к экземпляру: my-project-name: my-region: my -db-instance ')

Согласно этому вопросу , мне нужно добавить префикс' / cloudsql / 'к имени моего экземпляра. Итак, я изменил это (и спецификацию ENGINE), чтобы дать:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'INSTANCE': '/cloudsql/my-project-name:my-region:my-db-instance',
        'NAME': 'my-db-name',
        'USER' : 'root',
        'PASSWORD': '******************',
    },

Я загрузил измененный файл в Google (используя развертывание приложения gcloud). На этот раз я получаю совершенно другой экран ошибок, на котором отображается:

Ошибка: ошибка сервера

Сервер обнаружил ошибку и не смог выполнить ваш запрос.

Пожалуйста повторите попытку через 30 секунд.

Когда я просматриваю Журналы, я вижу:

Неправильно сконфигурировано: Ошибка загрузки модуля MySQLdb: Нет модуля с именем MySQLdb

* * * * * * * * * * * * * * * * * * * * * * * * * * * *1040* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Плитка * * * * * * * * [10] Соединения с базой данных теперь должны быть сделаны с помощью сокета домена Unix.

Google предоставляет документацию и примеры того, как это сделать. Однако я не считаю инструкции Google очень полезными. Для подключения приложения Python они дают следующий пример кода:

main.py:
db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(
        drivername="mysql+pymysql",
        username=db_user,
        password=db_pass,
        database=db_name,
        query={"unix_socket": "/cloudsql/{}".format(cloud_sql_connection_name)},
    ),
)

В моем приложении нет файла main.py, поэтому я действительно не уверен, куда поместить этот код. Я посмотрел полный пример кода для этого в GitHub, но я не знаю, какие изменения мне нужно внести в мой файл settings.py или в другое место в моем приложении.

Мой вопрос: сделать Мне действительно нужно go по этому маршруту (перейти на использование библиотеки SQLalchemy), или я могу обновить свое приложение Django для работы с экземпляром Google Cloud SQL второго поколения, просто внеся некоторые изменения в мой файл settings.py ? И, если да, что изменится?

Мое приложение использует Django 1.4, Python 2.7, и я не использую фреймворк Flask, который предлагает Google.

Я узнал использовать Django исключительно для целей написания этого приложения 5 лет go, но я не использовал его с тех пор - поэтому я забыл почти все, что я знал о Django и Python.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Несколько замечаний, прежде чем я начну: Django 1.4 и Python 2.7 больше не поддерживаются, поэтому эта конфигурация может работать или не работать.

Вы были на правильном пути до той части, где вы представили инструкции SQLAlchemy. Это не Django конфигурации. Вы должны быть в состоянии сохранить свой текущий синтаксис DATABASES при условии, что выполните следующие шаги:

  • Убедитесь, что вы добавляете настройки в свои app.yaml в разрешения для новой базы данных,
  • Убедитесь, что вы установили Cloud SQL Client (предпочтительно) разрешения для учетной записи службы App Engine.
  • Убедитесь, что у вас есть mysqlclient как Python зависимость.

Django в руководстве по Flex App App использует PostgreSQL, но включает в себя некоторые MySQL конкретные c предложения , которые должны быть полезны. Там также представлены образцы DATABASE .

Надеюсь, это поможет!

0 голосов
/ 09 апреля 2020

Большое спасибо glasnt за полезные советы. Это поставило меня на правильный путь, и вместе с некоторой информацией, которую я нашел в другом месте, я восстановил и снова начал работу моего сайта - к большому удовольствию моего клиента!

Вот подробности того, что мне пришлось изменить:

Я обновил свой файл app.yaml и добавил:

beta_settings: 
  cloud_sql_instance: "my-project-name:my-region:my-db-instance"

, а также:

libraries:
- name: MySQLdb
  version: "latest"

Я обновил settings.py и добавил:

import MySQLdb

и я обновил определение DATABASES:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '/cloudsql/my-project-name:my-region:my-db-instance',
        'NAME': 'my-db-name',
        'USER' : 'root',
        'PASSWORD': 'my-db-password',
    },

Я обнаружил, что мне не нужно настраивать какие-либо разрешения для учетной записи службы App Engine. Руководство по обновлению Google гласит:

Когда вы обновляете экземпляр с авторизованным проектом App Engine с первого поколения на второе поколение, Cloud SQL создает специальную учетную запись службы, которая предоставляет тот же доступ, что и у авторизованного проекта App Engine до обновления. Поскольку эта учетная запись службы разрешает доступ только к указанному экземпляру c, а не ко всему проекту, эта учетная запись службы не отображается на странице учетной записи службы IAM, и вы не можете обновить или удалить ее.

Таким образом, для перенесенного приложения первого поколения не нужно настраивать разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...