Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2018 14:48:41

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Доброго дня!
Написал модуль на питоне для получения нужной информации из БД аксес.
Всё работает хорошо, но из-за кол-ва запросов заметно медленно.
Вопрос в том, как эффективнее строить работу с БД из питона?
По этой теме всплывает понятие ОРМ.
В каком направлении двигаться?
Вот пример кода из модуля:

    def xunit(self, unitpos):
        sql = "SELECT xunit FROM TElems WHERE unitpos = {}".format(unitpos)
        return round(self.RS(sql),1)
    def yunit(self, unitpos):
        sql = "SELECT yunit FROM TElems WHERE unitpos = {}".format(unitpos)
        return round(self.RS(sql),1)
    def zunit(self, unitpos):
        sql = "SELECT zunit FROM TElems WHERE unitpos = {}".format(unitpos)
        return round(self.RS(sql),1)

Офлайн

#2 Сен. 25, 2018 00:17:02

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2578
Репутация: +  58  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

А много ли данных в базе?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Сен. 25, 2018 06:51:05

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Ruchey
из-за кол-ва запросов заметно медленно
А зачем вы делаете три запроса там, где можно сделать один?

 sql = "SELECT * FROM TElems WHERE unitpos = {}".format(unitpos)
Внезапно!

Офлайн

#4 Сен. 25, 2018 06:54:21

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Не знаю, чем определить это “много”. База весит 23Мб
В любом случаи, когда собираю данные и даже если просто вывести через print, а не в эксель, то идёт заметная задержка секунды на 2-3
Как сказал один человек, слишком много открывания и закрывания БД, много запросов.
Вот ещё пример кода от туда

 def band_side(self, unitpos, IDLine, IDPoly=1):
        '''информация о кромке торца'''
        b_priceID = 0       # id кромки в номенклатуре
        b_name = ''         # название кромки
        b_width = 0         # ширина кромки
        b_thickPan = 0      # толщина панели
        b_thick = 0         # толщина кромки
        b_cnt = 0
        keys = ('ID', 'Name', 'Width', 'ThickPan', 'ThickBand', 'Count')
        # определим тип панели
        # PanPolyType: 1 - полилиния 2 - прямоугольная 3 - четырёхугольная
        sql = "SELECT tpm.NumValue FROM TParams AS tpm WHERE (tpm.unitpos = {} AND tpm.ParamName='PanPolyType' AND tpm.HoldTable='TPanels')".format(unitpos)
        PolyType = int(self.RS(sql))
        if (PolyType == 2) or (PolyType == 3):
            sql = "SELECT bu.BandUnitPos, tn.ID, tn.Name, Count FROM (SELECT idp.NumValue AS IDPoly, idl.NumValue AS IDLine, idb.NumValue AS BandUnitPos "\
                  "FROM (TParams idp LEFT OUTER JOIN TParams idl ON idp.UnitPos=idl.UnitPos AND idp.HoldTable=idl.HoldTable AND idp.Hold1=idl.Hold1 "\
                  "AND idp.Hold3=idl.Hold3) LEFT OUTER JOIN TParams idb ON idp.UnitPos=idb.UnitPos AND idp.HoldTable=idb.HoldTable AND idp.Hold1=idb.Hold1 "\
                  "AND idp.Hold3=idb.Hold3 WHERE idp.UnitPos={0} AND idp.HoldTable='TPaths' AND idp.Hold1=1 AND idp.ParamName='IDPoly' AND idl.ParamName='IDLine' "\
                  "AND idb.ParamName='BandUnitPos') bu, TNNomenclature tn, TElems te WHERE bu.BandUnitPos=te.UnitPos AND te.PriceID=tn.ID AND IDPoly={1} AND IDLine={2}".format(unitpos, IDPoly, IDLine)
            res = self.db.recordset(sql)
            if res:
                bandID = (res[0][0])
                b_priceID = (res[0][1])
                b_name = (res[0][2])
                b_cnt = (res[0][3])
                sql = "SELECT Width FROM TBands WHERE UnitPos={}".format(bandID)
                res = self.db.recordset(sql)
                if res:
                    b_thickPan = (res[0][0])
                sql = "SELECT tnpv.DValue FROM TNPropertyValues AS tnpv WHERE tnpv.PropertyID=21 AND tnpv.EntityID={}".format(b_priceID)
                res = self.db.recordset(sql)
                if res:
                    b_width = (res[0][0])
                sql = "SELECT tnpv.DValue FROM TNPropertyValues AS tnpv WHERE tnpv.PropertyID=10 AND tnpv.EntityID={}".format(b_priceID)
                res = self.db.recordset(sql)
                if res:
                    b_thick = (res[0][0])            
        return dict(zip(keys,(b_priceID, b_name, b_width, b_thickPan, b_thick, b_cnt)))

Офлайн

#5 Сен. 25, 2018 06:59:34

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Papa_Svin
Это работа с мебельной программой.
Что бы создать отчёт по мебели, нужно получать информацию в разном виде.
Например, мне надо получить информацию по торцу В. Вот и создана одна функция, которая возвращает только эту инфу. Например, функция которая возвращает кромку только по одному торцу, крепёж только по одному торцу и т.д.
Т.е. если мне надо узнать кромку по четырём торцам, то делается четыре отдельных запроса. Объединять их в один запрос нельзя, т.к. нужна инфа по каждому торцу отдельно.
Запрос из вашего примера, такой у меня тоже есть отдельно это запрос на получения всех данных из любой таблице
 sql = "SELECT * FROM TElems WHERE unitpos = {}".format(unitpos)

Отредактировано Ruchey (Сен. 25, 2018 07:01:52)

Офлайн

#6 Сен. 25, 2018 09:35:37

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2578
Репутация: +  58  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

В вашем случае можно получить полный набор типа select * from …
и присвоить его переменной и работать уже с ней.



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#7 Сен. 25, 2018 10:59:09

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

А с ORM кто-нибудь знаком?
Уместно ли тут применение орм?

Офлайн

#8 Сен. 25, 2018 11:57:19

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Ruchey
ORM это вам не волшенбная кнопочка “сделать хорошо”. Это средство что бы не писать sql запросы, а работать с объектами (ну это если ооочень сильно упростить)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Сен. 25, 2018 12:14:08

Ruchey
Зарегистрирован: 2014-05-26
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

JOHN_16
RucheyORM это вам не волшенбная кнопочка “сделать хорошо”. Это средство что бы не писать sql запросы, а работать с объектами (ну это если ооочень сильно упростить)
Я примерно понимаю что такое орм, что работа с объектами, а не с запросами.
Вопрос в том, эта орм ускорит работу с БД?

Офлайн

#10 Сен. 25, 2018 12:30:42

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Работа с БД access. Много запросов

Ruchey
Вопрос в том, эта орм ускорит работу с БД?
Блин, вот как вы себе это представляете? ОРМ генерирует запросы на основе вызовов методов объекта, как это может что-то ускорить?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version