Подключение к базе данных Google Cloud MySQL в AppEngine (Python) - PullRequest
1 голос
/ 14 июня 2019

У меня было много проблем с этим, и я нашел несколько различных типов синтаксиса, чтобы сделать это, и пока что ни один из них, похоже, не работает.

https://cloud.google.com/sql/docs/mysql/connect-app-engine на основе этого урокаИз Google кажется, что sqlalchemy - лучший инструмент для использования, которого я никогда не видел до сих пор.

Я следовал всем остальным инструкциям, но не могу понять, где находится / cloudsql / INSTANCE_CONNECTION_NAME.Я предполагаю, что сокет, на который он ссылается, является страницей соединения экземпляра на странице обзора SQL.Мой выглядит примерно так: MYPROJECT: us-east1: MYSQLINSTANCE.Я также видел некоторую документацию, в которой экземпляр SQL заменен на имя базы данных, поэтому я тоже безуспешно пытался это сделать.

Сейчас моя строка подключения Python выглядит как

db = sqlalchemy.create_engine(
unix_socket=/cloudsql/MYPROJECT:us-east1:MYSQLINSTANCE
    sqlalchemy.engine.url.URL(
        drivername='mysql+pymysql',
        username=MYUSERNAME,
        password=MYPASSWORD,
        database=MYDATABASE,
        query={
            'unix_socket': '/cloudsql/{}'.format('MYPROJECT:us-east1:MYSQLINSTANCE')
        }
    ),
    pool_size=10,
    max_overflow=2,
    pool_timeout=30,  # 30 seconds
    pool_recycle=1800,  # 30 minutes
)

И сейчас он говорит мне, что не может подключиться к экземпляру SQL на localhost, хотя я явно не пытаюсь подключиться на localhost.Я попытался соединиться с переменными среды, определенными в App.YAML, как определено в учебном пособии, а также изменил App.YAML на основе пары различных версий синтаксиса, которые я нашел в Интернете, но никакая комбинация на самом деле не работает.Так что сейчас я просто подключаю переменные непосредственно в свой main.py, который, как я знаю, менее безопасен.

Я также попытался сделать URL-адрес подключения длинным URL-адресом, например

db = sqlalchemy.create_engine(
    unix_socket=/cloudsql/MYPROJECT:us-east1:MYSQLINSTANCE
        sqlalchemy.engine.url.URL(mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<MYPROJECT>:us-east1:<MYSQLINSTANCE>
        ),
        pool_size=10,
        max_overflow=2,
        pool_timeout=30,  # 30 seconds
        pool_recycle=1800,  # 30 minutes
    )

и это дает мне странную ошибку, которая выглядит как Не могу загрузить плагин: sqlalchemy.dialects: mysql.pymysql: // (тот URL, который я там ввел)

Я также посмотрел на подключение черезобщедоступный IP-адрес, указанный на странице SQL, но для этого требуется соединение в белый список, и я не уверен, с какого IP-адреса будет подключаться приложение Appengine.Несмотря на это, я не уверен, что лучший способ сделать это на данный момент, и любая помощь в установлении этой связи будет принята с благодарностью.Сейчас я просто бьюсь головой о стену.

1 Ответ

0 голосов
/ 14 июня 2019

Первый - <INSTANCE_CONNECTION_STRING> в формате <project>:<region>:<instance> и находится на странице «обзора» для вашего экземпляра Cloud SQL (рядом с IP-адресом).

Второй - сокет на /cloudsql/<INSTANCE_CONNECTION_STRING> автоматически доступен для вас при работе в стандарте App Engine. Когда вы работаете локально, вам нужно предоставить свой собственный. Вместо этого вы можете подключиться через IP или использовать cloudsql-proxy , чтобы создать его в том же месте, где находится App Engine.

Чтобы подключение App Engine работало, вам нужно сделать несколько вещей. Во-первых, убедитесь, что у вас включен API-интерфейс администратора Cloud SQL. Затем необходимо убедиться, что учетная запись IAM, с которой вы используете соединение, имеет роль Cloud SQL Connect. Перейдите на страницу IAM и убедитесь, что учетная запись службы имеет правильные разрешения (если вы не используете свою собственную, App Engine имеет учетную запись службы по умолчанию).

Причина, по которой ошибка жалуется на 'localhost', заключается в том, что pymysql использует хост по умолчанию для этой ошибки, даже если для попытки подключения используется сокет unix.

...