Подключение к экземпляру Google Cloud SQL Postgres с помощью psycopg2

# #postgresql #google-app-engine #flask #psycopg2 #google-cloud-sql

Вопрос:

Я пытаюсь подключиться к Google Cloud SQL Postgres с помощью psycopg2.

Я создал экземпляр PostgreSQL и на данный момент использую базу postgres данных по умолчанию. Я могу подключиться с помощью инструмента pgadmin, а также из оболочки gcloud, и запросы дают ожидаемый результат.

Я разработал приложение flask и развернул его на стандартном движке приложений.

conn = psycopg2.connect(database="postgres", user = "postgres", password = "password", host = "/cloudsql/my-new-db")

И когда я запускаю его, появляется psycopg2.OperationalError: could not connect to server: No such file or directory ошибка get.

У меня есть предчувствие, что значение хоста неверно. Я пробовал различные варианты, такие как /cloudsql/<prj-name>.<region>.<db-instance-name>

Но, похоже, ничего не работает. Что еще я должен сделать, чтобы устранить эту ошибку?

Ответ №1:

Как упоминалось в этой статье о подключении к облачному SQL из app engine:

 Connecting with Unix sockets

Once correctly configured, you can connect your service to your Cloud SQL instance's Unix domain socket accessed on the environment's filesystem at the following path: /cloudsql/INSTANCE_CONNECTION_NAME.

The INSTANCE_CONNECTION_NAME can be found on the Overview page for your instance in the Google Cloud Console or by running the following command:
 
    gcloud sql instances describe [INSTANCE_NAME]
 

Комментарии:

1. Я использую модуль psycopg2, а не ORM sqlalchemy. Можете ли вы помочь мне с модулем psycopg2?

2. Путь к сокету UNIX одинаков, независимо от того, используете ли вы sqlalchemy или psycopg2.

3. опубликовал свое решение в качестве ответа

Ответ №2:

на вашем сервере flask обязательно установите библиотеку psycopg2 (установите pip или используйте apt-get install). Я прикрепил небольшой фрагмент кода, который у меня есть для успешного подключения к моей базе данных Postgres, и, возможно, это каким-то образом поможет. Я заметил, что у вас не указан порт.

 connection = psycopg2.connect(
   user = 'userName',
   password = password,
   host = 'some ip here',
   port = '5432',
   database = 'db name here'
)
 

Хост в моем случае-это IP-адрес сервера, на который перенаправлен порт для доступа к моему серверу flask. Я не уверен, каким способом вы получаете доступ к своему хосту. Мой API и база данных flask фактически размещены на отдельных виртуальных машинах в облаке Google. Я надеюсь, что это вообще помогло, если это не так, возможно, можно было бы предоставить больше контекста, и я мог бы посмотреть на это подробнее.

Ответ №3:

 unix_socket = '/cloudsql/{}'.format("my-project-id:us-central1:my-db-name")

conn = psycopg2.connect(database="postgres", user = "postgres", password = "password", host = unix_socket)
 

Это сработало для меня.