Создать пул соединения с бд postgresql и библиотекой asyncpg
Имеется готовый файл с командами для базы данных. Я не понимаю как создать пул и использовать его в функциях postgresql. Для подключения имеются данные хоста, порт, логин и пароль. Вот, собственно, код:
class DBComm:
async def select(self, conn):
values = await conn.fetchrow('SELECT * FROM users')
a = dict(values)
data = [f"{k}-{v}" for k, v in values.items()]
# print(data)
text = "\n".join(data)
# print(text)
return text
async def db_new_user(conn, use=True, uses=1):
user = types.User.get_current()
user_id = user.id
full_name = user.full_name
args = (user_id, use, full_name)
await conn.execute('INSERT INTO users (user_id, use, full_name, uses) VALUES ($1, $2, $3, $4) RETURNING id',
user_id, use, full_name, uses)
await conn.close()
async def db_user_exists(conn):
user = types.User.get_current()
user_id = user.id
result = await conn.execute('SELECT * FROM users WHERE user_id = $1', user_id)
result = int(result.replace('SELECT', ''))
await conn.close()
return bool(result)
async def db_usage(conn):
user = types.User.get_current()
user_id = user.id
await conn.execute('UPDATE users SET uses = uses + 1 WHERE user_id = $1', user_id)
await conn.close()
async def db_get_info(info, conn):
user_id = int(info)
print("userid", user_id)
rer = await conn.fetchrow('SELECT * FROM users WHERE user_id = $1', user_id)
a = dict(rer)
data = [f"{k}-{v}" for k, v in rer.items()]
# print(data)
text = "\n".join(data)
print(text)
await conn.close()
return text
Ответы (1 шт):
Автор решения: asanisimov
→ Ссылка
Для создания пула соединений в asyncpg имеется функция create_pool с параметрами которая возвращает экземпляр пула соединений. В вашем случае можно добавить создание пула в __init__ или вынести его в отдельный класс, если будет использоваться еще где то.
Пример:
class DBComm:
def __init__(self, config: dict):
self.pool = asyncpg.create_pool(**config)
async def select(self):
values = await self.pool.fetchrow('SELECT * FROM users') # пул сам выберет одно из доступных соединений
a = dict(values)
data = [f"{k}-{v}" for k, v in values.items()]
# print(data)
text = "\n".join(data)
# print(text)
return text
Вы можете явно получать соединение из пула методом con = pool.acquire() и возвращать его pool.release(con). Разумеется можно все делать с использованием контекстного менеджера.