Как ускорить работу с sqlalchemy?

Рейтинг: 0Ответов: 0Опубликовано: 03.04.2023

Имеется большая база данных и, видимо, много времени тратиться на её reflect. Вот мой код:

class DataBase:

    def __init__(self, config_bd: Any):
        """ Подключение к БД """

        self.config_bd = config_bd
        host = self.config_bd["host"]
        port = self.config_bd["port"]
        sid = self.config_bd["sid"]
        user = self.config_bd["user"]
        password = self.config_bd["password"]
        sid = orcbd.makedsn(host, port, sid=sid)

        try:
            self.time_start = time.time()
            self.engine = db.create_engine(f"oracle+cx_oracle://{user}:{password}@{sid}", echo=True)
            self.metadata_obj = MetaData()
            # self.metadata_obj.reflect(bind=self.engine, only=[f'{table_name}'])
            self.Session = sessionmaker(self.engine)
            self.session = self.Session()
        except Exception as _ex:
            print("Ошибка при подключении к БД", _ex)
        else:
            print("Соединение с БД установлено")

    def get_table(self, table_name: str):
        """
        Получение таблицы

        @param table_name:
            Название таблицы
        """

        table = Table(table_name, self.metadata_obj, autoload_with=self.engine)
        return table

    def get_column(self, table_name: str):
        """
        Получение столбцов из таблицы

        @param table_name:
            Название таблицы
        """
        table = self.get_table(table_name)
        columns = [c.name for c in table.columns]
        print("Столбцы из таблицы:", columns)
        return columns

    def select_from_table(self, table_name: str, where=None):
        """
        Выборка из таблицы

        @param table_name:
            Название таблицы

        @param where:
            Запрос для выборки
        """

        table = self.get_table(table_name)
        match where:
            case None:
                task = self.session.query(table)
            case _:
                task = self.session.query(table).filter_by(**where)
        result = [c for c in task]
        return result

На запрос обычного select'а тратиться 8 секунд. Хотя если не использовать sqlalche,y, то на этот же запрос тратиться меньше секунды. Я только начинаю работать с алхимией, может я что-то не так делаю?

Ответы

Ответов пока нет.