Может ли SQLAlchemy использоваться с Google Cloud SQL?
Я просмотрел документацию Google Cloud SQL и различные поисковые запросы, но я не могу выяснить, можно ли использовать SQLAlchemy с Google Cloud SQL, и если да, то каким должен быть URI соединения.
Я использую расширение Flask-SQLAlchemy и нуждаюсь в строке подключения следующим образом:
mysql://username:[email protected]/db
Я видел пример Django, но, похоже, в конфигурации используется другой стиль, чем строка подключения. https://developers.google.com/cloud-sql/docs/django
Документация Google Cloud SQL:
https://developers.google.com/cloud-sql/docs/developers_guide_python
Ответы
Ответ 1
Обновление
Google Cloud SQL теперь поддерживает прямой доступ, поэтому теперь можно использовать диалект MySQLdb
. Рекомендуемое соединение через диалоги mysql использует формат URL:
mysql+mysqldb://[email protected]/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>
mysql+gaerdbms
устарел в SQLAlchemy с версии 1.0
Я оставляю исходный ответ ниже, если другие по-прежнему считают это полезным.
Для тех, кто позже посещает этот вопрос (и не хочет читать все комментарии), SQLAlchemy теперь поддерживает Google Cloud SQL с версии 0.7.8, используя строку/диалект подключения (см. docs):
mysql+gaerdbms:///<dbname>
например:.
create_engine('mysql+gaerdbms:///mydb', connect_args={"instance":"myinstance"})
Я предложил обновление на диалект mysql+gaerdmbs://
для поддержки обоих API Google Cloud SQL (rdbms_apiproxy
и rdbms_googleapi
) для подключения к Cloud SQL из экземпляра, не входящего в состав приложения Google App Engine (например, рабочей станции разработки). Это изменение также немного изменит строку соединения, включив проект и экземпляр как часть строки, и не требует передачи отдельно через connect_args
.
например.
mysql+gaerdbms:///<dbname>?instance=<project:instance>
Это также упростит использование Cloud SQL с Flask-SQLAlchemy или другим расширением, если вы явно не вызываете вызов create_engine()
.
Если у вас возникли проблемы с подключением к Google Cloud SQL с рабочей станции разработки, вы можете посмотреть мой ответ здесь - fooobar.com/questions/325154/.... p >
Ответ 2
Да,
Если вы обнаружили ошибки в SA + Cloud SQL, сообщите мне. Я написал код диалекта, который был интегрирован в SQLAlchemy. Там немного глупое дело о том, как Cloud SQL генерирует исключения, поэтому там могут быть некоторые свободные концы.
Ответ 3
это выполнимо, хотя я вообще не использовал Flask, поэтому я не уверен в установлении соединения через него. Я получил его через Pyramid и представил патч к SQLAlchemy (возможно, к неправильному репо) здесь:
https://bitbucket.org/sqlalchemy/sqlalchemy/pull-request/2/added-a-dialect-for-google-app-engines
С тех пор он был заменен и принят в SQLAlchemy как
http://www.sqlalchemy.org/trac/ticket/2484
Я не думаю, что это пошло по пути к релизу.
Есть некоторые проблемы с Google SQL, которые бросают разные исключения, поэтому у нас были проблемы с такими вещами, как автоматическое развертывание базы данных. Вам также необходимо отключить объединение пулов с помощью NullPool, как указано во втором патче.
Мы с тех пор перешли на использование хранилища данных через NDB, поэтому я не следил за прогрессом этих исправлений какое-то время.
Ответ 4
Для тех, кто предпочитает PyMySQL над MySQLdb (что предлагается в принятом ответе), строки соединения SQLAlchemy:
Для производства
mysql+pymysql://<USER>:<PASSWORD>@/<DATABASE_NAME>?unix_socket=/cloudsql/<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>
Пожалуйста, убедитесь, что
Для локального развития
mysql+pymysql://<USER>:<PASSWORD>@localhost:3306/<DATABASE_NAME>
учитывая, что вы запустили прокси-сервер Cloud SQL с помощью:
cloud_sql_proxy -instances=<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>=tcp:3306