Задать вопрос
@Stas_VTK

Как работать с БД из другого класса?

Имеется постоянно работающая часть телеграмм бота. При получении сообщения необходимо выполнить запрос к бд и вернуть результат. Верно ли я отобразил логику работы этого момента? Т.е. при создании экземпляра объекта Sql сразу произойдет соединение с сервером бд, или момент создания соединения можно(нужно?) вынести в Sql.result? И при возврате сообщения экземпляр класс будет автоматически уничтожен?

work.py
import db
class SomeJob:
   # часть телеграм бота, запущена постоянно,
   #  ждет сообщения
   ..........
   async def handle_update(....)
      # пришло сообщение, обрабатывается
      # необходимо выполнить запрос к ms sql серверу
      request = db.Sql()
      msg = request.result("строка-параметр")
      ...........
      await ... отправили сформированное сообщение
      что происходит с объектом request в этот момент?


db.py
import pyodbc
import ......

class Sql:
   def __init__(self, param: str):
      self.param = param
      self.connect_str = "....."
      self.conn = pyodbc.connect(connect_str)
      self.cursor = conn.cursor()
   
   def result(self.param):
	# тут анализируется self.param и на его основании выполняется запрос
        sql_str = "......"
        self.cursor.execute(sql_str)
        ...........................
        # завершение обработки
        self.cursor(close)
        self.conn(close)
        return(результат запроса)
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Из приведённого кода не понятно для чего вообще выделен класс Sql.
Фактически вы используете только один метод этого класса, а содержимое конструктора можно разместить в том же методе.
Бессмысленно и беспощадно.
Самое правильное - это делать всё как можно проще.
Вот два очень полезных принципа в разработке:
- https://ru.wikipedia.org/wiki/KISS_(принцип)
- https://ru.wikipedia.org/wiki/Бритва_Оккама

В приведённом вами куске кода не нужен класс sql, достаточно сделать всё внутри одной функции, ведь вы не используете созданный обьект больше никак.
Другой вопрос, если вам нужно делать много запросов в рамках одного подключения к БД. На подключение тратяся некоторые накладные расходы по времени и трафику, иногда логично вынести подключение и хранить его в выделенном персистентном состоянии, которое будет создано один раз и переиспольовано для множества запросов. В этом случае закрывать коннект после запроса нельзя.
Прочитайте вот: https://pavel-karateev.gitbook.io/intermediate-pyt...
Обычно коннект к БД уже является менеджером контекста. Для чего вы делаете вот эту бессмысленную обёртку вокруг - не ясно.
В соответствии с хоошим стилем прогаммирования нужно, чтобы действие любой функции можно было охарактеризовать простой короткой фразой без союзов, без "и" и "или", без "если".
Иначе эту функцию стоило бы разбить на более мелкие и простые функции.
Вот ознакомьтесь с концепцией чистой функции: https://dvmn.org/encyclopedia/clean_code/decomposi...
Ответ написан
Chaki09
@Chaki09
fullstack web developer
Посмотри в сторону паттерна singleton, смысл его ипользования в создании единого экземпляра и использования этого экземпляра везде где нужно!
Должно получиться что-то типо такого, останется дописать методы выполнения запроса

import sqlite3

class Db(object):
  
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance') or not cls.instance:
          cls.instance = super().__new__(cls)
        return cls.instance

    def __init__(self, connection_args):
        self.connector = sqlite3.connect(connection_args)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы