Форум сайта python.su
Доброго дня!
Написал модуль на питоне для получения нужной информации из БД аксес.
Всё работает хорошо, но из-за кол-ва запросов заметно медленно.
Вопрос в том, как эффективнее строить работу с БД из питона?
По этой теме всплывает понятие ОРМ.
В каком направлении двигаться?
Вот пример кода из модуля:
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)
Офлайн
А много ли данных в базе?
Офлайн
RucheyА зачем вы делаете три запроса там, где можно сделать один?
из-за кол-ва запросов заметно медленно
sql = "SELECT * FROM TElems WHERE unitpos = {}".format(unitpos)
Офлайн
Не знаю, чем определить это “много”. База весит 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)))
Офлайн
Papa_SvinЭто работа с мебельной программой.
sql = "SELECT * FROM TElems WHERE unitpos = {}".format(unitpos)
Отредактировано Ruchey (Сен. 25, 2018 07:01:52)
Офлайн
В вашем случае можно получить полный набор типа select * from …
и присвоить его переменной и работать уже с ней.
Офлайн
А с ORM кто-нибудь знаком?
Уместно ли тут применение орм?
Офлайн
Ruchey
ORM это вам не волшенбная кнопочка “сделать хорошо”. Это средство что бы не писать sql запросы, а работать с объектами (ну это если ооочень сильно упростить)
Офлайн
JOHN_16Я примерно понимаю что такое орм, что работа с объектами, а не с запросами.
RucheyORM это вам не волшенбная кнопочка “сделать хорошо”. Это средство что бы не писать sql запросы, а работать с объектами (ну это если ооочень сильно упростить)
Офлайн
RucheyБлин, вот как вы себе это представляете? ОРМ генерирует запросы на основе вызовов методов объекта, как это может что-то ускорить?
Вопрос в том, эта орм ускорит работу с БД?
Офлайн