Обновите токен подключения в ConnectionPool psycopg3.Python

Программы на Python
Ответить
Anonymous
 Обновите токен подключения в ConnectionPool psycopg3.

Сообщение Anonymous »

Я использую psycopg3 для инициализации AsyncConnectionPool. Моя база данных Postgres размещена в Azure. Я подключаюсь через управляемое удостоверение. Поэтому я получаю от Microsoft токен, действительный в течение одного часа. Инициализация пула и первые соединения (в течение часа, когда токен действителен) работают нормально. Когда срок действия токена истек и необходимо установить новые соединения, я получаю следующую ошибку: «Ошибка подключения в пуле 1: соединение не выполнено: соединение с сервером по адресу «127.0.0.1», порт 5433 не выполнено: FATAL: токен доступа Срок действия истек. Пожалуйста, приобретите новый токен и повторите попытку."
Поэтому я думаю, что строка conninfo сохранена. Но почему-то мне приходится вызывать get_conninfo() каждый раз, когда должно быть установлено новое соединение. Есть идеи, как решить эту проблему?
Вот часть моей реализации.
@classmethod
async def connect(cls):
"""Initializes the connection pool."""
async with cls._lock:
if cls._instance is None:
cls._instance = cls()
if not hasattr(cls._instance, 'pool'):
# Retrieve connection parameters
cls._instance.user = settings.user
cls._instance.host = settings.host
cls._instance.port = settings.port
cls._instance.dbname = settings.dbname
cls._instance.connection_type = settings.connection_type

if cls._instance.connection_type == "managed_identity":
cls._instance.credential = ManagedIdentityCredential()
else:
cls._instance.password = settings.pgvector.pgvector_password.get_secret_value()

cls._instance.pool = AsyncConnectionPool(
conninfo=await cls._instance.get_conninfo(),
open=True
)
await cls._instance.pool.open()
logger.info("Async database connection pool initialized in PostgresClient.")

@classmethod
async def get_conninfo(cls) -> str:
"""Returns connection info string based on the connection type."""
if cls._instance.connection_type == "managed_identity"
# retrieve token from Microsoft
access_token = cls._instance.credential.get_token(
"https://ossrdbms-aad.database.windows.net/.default"
)
return (
f"dbname={cls._instance.dbname} host={cls._instance.host} "
f"port={cls._instance.port} sslmode=require user={cls._instance.user} "
f"password={access_token.token}"
else:
...



Подробнее здесь: https://stackoverflow.com/questions/793 ... ectionpool
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»