HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Python
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 13.01.2022, 18:46
Толкин
Участник форума
Регистрация: 09.01.2020
Сообщений: 134
С нами: 3340178

Репутация: 33
По умолчанию

Всех приветствую, многие используют разные реализации для работы с БД, я же использую все в одном файле, и всегда использую его в каждом своем проекте, сейчас же хочу показать данный простой способ реализации вам.

Для начала создадим отдельный файлик в котором будем хранить свой класс для работы с БД, у меня это postgres.py

Импортируем необходимые библиотеки:

Python:





Код:
from
typing
import
Union
import
asyncpg
from
asyncpg
import
Connection
from
asyncpg
.
pool
import
Pool


После создадим сам класс и добавим в него метод инициализации:

Python:





Код:
class
DataBaseClass
:
def
__init__
(
self
)
:
self
.
pool
:
Union
[
Pool
,
None
]
=
None


Тут мы добавляем переменную pool, чтобы хранить в ней данные о нашем подключении.

Далее добавим само подключение к БД через asyncpg:

Python:





Код:
async
def
create_pool
(
self
)
:
self
.
pool
=
await
asyncpg
.
create_pool
(
'данные для подключения'
)


Тут мы нашу переменную pool добавляем пул подключения к БД Постгри.

И теперь самая главная функция, которая будет ответственна за запросы к БД Постгри:

Python:





Код:
async
def
execute
(
self
,
command
:
str
,
*
args
,
fetch
:
bool
=
False
,
fetchval
:
bool
=
False
,
fetchrow
:
bool
=
False
,
execute
:
bool
=
False
)
:
async
with
self
.
pool
.
acquire
(
)
as
connection
:
connection
:
Connection
async
with
connection
.
transaction
(
)
:
if
fetch
:
result
=
await
connection
.
fetch
(
command
,
*
args
)
elif
fetchval
:
result
=
await
connection
.
fetchval
(
command
,
*
args
)
elif
fetchrow
:
result
=
await
connection
.
fetchrow
(
command
,
*
args
)
elif
execute
:
result
=
await
connection
.
execute
(
command
,
*
args
)
return
result


Вызывая execute мы отправляем ему необходимый для нас запрос и выставляем аргумент который для нас необходим, пример:

Python:





Код:
result
=
await
DataBase
.
execute
(
"SELECT username, balance FROM users WHERE chat_id = $1"
,
message
.
from_user
.
id
,
fetchval
=
True
)
print
(
'Ваш баланс:'
,
result
[
0
]
[
'balance'
]
)
print
(
'Ваш ник:'
,
result
[
0
]
[
'username'
]
)


Python:





Код:
result
=
await
DataBase
.
execute
(
"SELECT id, username FROM users "
,
fetchval
=
True
)
for
row
in
result
:
print
(
f'ID:{row["id"]}| Имя:{row["username"]}'
)


В конец после создания класса добавляем:

Python:





Код:
DataBase
=
DataBaseClass
(
)


Далее отправляемся к нашему main(if __name__ == '__main__'

Python:





Код:
loop
=
asyncio
.
get_event_loop
(
)
loop
.
run_until_complete
(
DataBase
.
create_pool
(
)
)


Будьте внимательны, повторный вызов get_event_loop может вызвать ошибку.

Полный код класса:

Python:





Код:
from
typing
import
Union
import
asyncpg
from
asyncpg
import
Connection
from
asyncpg
.
pool
import
Pool
class
DataBaseClass
:
def
__init__
(
self
)
:
self
.
pool
:
Union
[
Pool
,
None
]
=
None
async
def
create_pool
(
self
)
:
self
.
pool
=
await
asyncpg
.
create_pool
(
'Ваше подключение'
)
async
def
execute
(
self
,
command
:
str
,
*
args
,
fetch
:
bool
=
False
,
fetchval
:
bool
=
False
,
fetchrow
:
bool
=
False
,
execute
:
bool
=
False
)
:
async
with
self
.
pool
.
acquire
(
)
as
connection
:
connection
:
Connection
async
with
connection
.
transaction
(
)
:
if
fetch
:
result
=
await
connection
.
fetch
(
command
,
*
args
)
elif
fetchval
:
result
=
await
connection
.
fetchval
(
command
,
*
args
)
elif
fetchrow
:
result
=
await
connection
.
fetchrow
(
command
,
*
args
)
elif
execute
:
result
=
await
connection
.
execute
(
command
,
*
args
)
return
result

DataBase
=
DataBaseClass
(
)


Надеюсь для кого-то это будет полезным.
 
Ответить с цитированием

  #2  
Старый 28.01.2022, 21:10
Neon3333
Участник форума
Регистрация: 13.02.2019
Сообщений: 183
С нами: 3815624

Репутация: 83
По умолчанию

Цитата:
Сообщение от Толкин  

Всех приветствую, многие используют разные реализации для работы с БД, я же использую все в одном файле, и всегда использую его в каждом своем проекте, сейчас же хочу показать данный простой способ реализации вам.

Для начала создадим отдельный файлик в котором будем хранить свой класс для работы с БД, у меня это postgres.py

Импортируем необходимые библиотеки:

Python:





Код:
from
typing
import
Union
import
asyncpg
from
asyncpg
import
Connection
from
asyncpg
.
pool
import
Pool


После создадим сам класс и добавим в него метод инициализации:

Python:





Код:
class
DataBaseClass
:
def
__init__
(
self
)
:
self
.
pool
:
Union
[
Pool
,
None
]
=
None


Тут мы добавляем переменную pool, чтобы хранить в ней данные о нашем подключении.
Далее добавим само подключение к БД через asyncpg:

Python:





Код:
async
def
create_pool
(
self
)
:
self
.
pool
=
await
asyncpg
.
create_pool
(
'данные для подключения'
)


Тут мы нашу переменную pool добавляем пул подключения к БД Постгри.

И теперь самая главная функция, которая будет ответственна за запросы к БД Постгри:

Python:





Код:
async
def
execute
(
self
,
command
:
str
,
*
args
,
fetch
:
bool
=
False
,
fetchval
:
bool
=
False
,
fetchrow
:
bool
=
False
,
execute
:
bool
=
False
)
:
async
with
self
.
pool
.
acquire
(
)
as
connection
:
connection
:
Connection
async
with
connection
.
transaction
(
)
:
if
fetch
:
result
=
await
connection
.
fetch
(
command
,
*
args
)
elif
fetchval
:
result
=
await
connection
.
fetchval
(
command
,
*
args
)
elif
fetchrow
:
result
=
await
connection
.
fetchrow
(
command
,
*
args
)
elif
execute
:
result
=
await
connection
.
execute
(
command
,
*
args
)
return
result


Вызывая execute мы отправляем ему необходимый для нас запрос и выставляем аргумент который для нас необходим, пример:

Python:





Код:
result
=
await
DataBase
.
execute
(
"SELECT username, balance FROM users WHERE chat_id = $1"
,
message
.
from_user
.
id
,
fetchval
=
True
)
print
(
'Ваш баланс:'
,
result
[
0
]
[
'balance'
]
)
print
(
'Ваш ник:'
,
result
[
0
]
[
'username'
]
)


Python:





Код:
result
=
await
DataBase
.
execute
(
"SELECT id, username FROM users "
,
fetchval
=
True
)
for
row
in
result
:
print
(
f'ID:{row["id"]}| Имя:{row["username"]}'
)


В конец после создания класса добавляем:

Python:





Код:
DataBase
=
DataBaseClass
(
)


Далее отправляемся к нашему main(if __name__ == '__main__'

Python:





Код:
loop
=
asyncio
.
get_event_loop
(
)
loop
.
run_until_complete
(
DataBase
.
create_pool
(
)
)


Будьте внимательны, повторный вызов get_event_loop может вызвать ошибку.

Полный код класса:

Python:





Код:
from
typing
import
Union
import
asyncpg
from
asyncpg
import
Connection
from
asyncpg
.
pool
import
Pool
class
DataBaseClass
:
def
__init__
(
self
)
:
self
.
pool
:
Union
[
Pool
,
None
]
=
None
async
def
create_pool
(
self
)
:
self
.
pool
=
await
asyncpg
.
create_pool
(
'Ваше подключение'
)
async
def
execute
(
self
,
command
:
str
,
*
args
,
fetch
:
bool
=
False
,
fetchval
:
bool
=
False
,
fetchrow
:
bool
=
False
,
execute
:
bool
=
False
)
:
async
with
self
.
pool
.
acquire
(
)
as
connection
:
connection
:
Connection
async
with
connection
.
transaction
(
)
:
if
fetch
:
result
=
await
connection
.
fetch
(
command
,
*
args
)
elif
fetchval
:
result
=
await
connection
.
fetchval
(
command
,
*
args
)
elif
fetchrow
:
result
=
await
connection
.
fetchrow
(
command
,
*
args
)
elif
execute
:
result
=
await
connection
.
execute
(
command
,
*
args
)
return
result

DataBase
=
DataBaseClass
(
)


Надеюсь для кого-то это будет полезным.
Паста со слитых 3483493482384 раз курсов никому не будет полезна
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.