Coverage for data_drive/data_sql.py: 38%
221 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 17:30 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 17:30 +0000
1from pprint import pprint
2import time
3from datetime import time as time_from_datatime
4import json
5from sqlalchemy import (
6 create_engine,
7 Column,
8 Integer,
9 String,
10 Float,
11)
12from sqlalchemy.exc import IntegrityError
13from sqlalchemy.orm import sessionmaker
14from sqlalchemy.orm import declarative_base
16from src.settings import Settings, inf, lg
18class Database:
19 Base = declarative_base()
20 # creating an SQLlite database in a file
21 engine = create_engine(Settings.data_base)
23 # Сcreating session for interective with database
24 Session = sessionmaker(bind=engine)
26 # creating all tables that do not yet exist
27 @classmethod
28 def create_all_tables(cls):
29 cls.Base.metadata.create_all(cls.engine)
34class Beton_zawod(Database.Base):
35 """base template for beton_zawod
37 Args:
38 Database.Base (class): base class from sqlalchemy
40 Returns:
41 str: description of this class
42 """
43 __tablename__ = "beton_zawod"
45 id_event_time = Column(Float, primary_key=True)
46 date_text = Column(String)
47 list_data = Column(String)
48 day = Column(Integer)
49 status = Column(Integer)
51 def __repr__(self):
52 return f"<BETHON(id_event_time={self.id_event_time}, DETE ={self.date_text})>"
54class Beton_odola(Database.Base):
55 """base template for beton_odola
57 Args:
58 Database.Base (class): base class from sqlalchemy
60 Returns:
61 str: description of this class
62 """
63 __tablename__ = "beton_odola"
65 id_event_time = Column(Float, primary_key=True)
66 date_text = Column(String)
67 list_data = Column(String)
68 day = Column(Integer)
69 status = Column(Integer)
71 def __repr__(self):
72 return f"<BETHON(id_event_time={self.id_event_time}, DETE ={self.date_text})>"
74class Beton_zeran(Database.Base):
75 """base template for beton_zeran
77 Args:
78 Database.Base (class): base class from sqlalchemy
80 Returns:
81 str: description of this class
82 """
83 __tablename__ = "beton_zeran"
85 id_event_time = Column(Float, primary_key=True)
86 date_text = Column(String)
87 list_data = Column(String)
88 day = Column(Integer)
89 status = Column(Integer)
91 def __repr__(self):
92 return f"<BETHON(id_event_time={self.id_event_time}, DETE ={self.date_text})>"
94class Beton_gora(Database.Base):
95 """base template for beton_gora
97 Args:
98 Database.Base (class): base class from sqlalchemy
100 Returns:
101 str: description of this class
102 """
103 __tablename__ = "beton_gora"
105 id_event_time = Column(Float, primary_key=True)
106 date_text = Column(String)
107 list_data = Column(String)
108 day = Column(Integer)
109 status = Column(Integer)
111 def __repr__(self):
112 return f"<BETHON(id_event_time={self.id_event_time}, DETE ={self.date_text})>"
114class Lista_zawod(Database.Base):
115 """base template for lista_zawod
117 Args:
118 Database.Base (class): base class from sqlalchemy
120 Returns:
121 str: description of this class
122 """
123 __tablename__ = "lista_zawod"
125 id_event_time = Column(Float, primary_key=True)
126 date_text = Column(String)
127 list_data = Column(String)
128 day = Column(Integer)
129 status = Column(Integer)
131 def __repr__(self):
132 return f"<LISTA(id_event_time={self.id_event_time}, DATE ={self.date_text})>"
134class Lista_odola(Database.Base):
135 """base template for lista_odola
137 Args:
138 Database.Base (class): base class from sqlalchemy
140 Returns:
141 str: description of this class
142 """
143 __tablename__ = "lista_odola"
145 id_event_time = Column(Float, primary_key=True)
146 date_text = Column(String)
147 list_data = Column(String)
148 day = Column(Integer)
149 status = Column(Integer)
151 def __repr__(self):
152 return f"<LISTA(id_event_time={self.id_event_time}, DATE ={self.date_text})>"
154class Lista_zeran(Database.Base):
155 """base template for lista_zeran
157 Args:
158 Database.Base (class): base class from sqlalchemy
160 Returns:
161 str: description of this class
162 """
163 __tablename__ = "lista_zeran"
165 id_event_time = Column(Float, primary_key=True)
166 date_text = Column(String)
167 list_data = Column(String)
168 day = Column(Integer)
169 status = Column(Integer)
171 def __repr__(self):
172 return f"<LISTA(id_event_time={self.id_event_time}, DATE ={self.date_text})>"
174class Lista_gora(Database.Base):
175 """base template for lista_gora
177 Args:
178 Database.Base (class): base class from sqlalchemy
180 Returns:
181 str: description of this class
182 """
183 __tablename__ = "lista_gora"
185 id_event_time = Column(Float, primary_key=True)
186 date_text = Column(String)
187 list_data = Column(String)
188 day = Column(Integer)
189 status = Column(Integer)
191 def __repr__(self):
192 return f"<LISTA(id_event_time={self.id_event_time}, DATE ={self.date_text})>"
195def record_beton(data):
196 """Inserting data into the concrete orders information table
198 Args:
199 data (dictionary): dictionary with elements wenz, day, lista_beton, date_of_day_text
200 """
201 session = Database.Session()
202 get_list_beton_serialize = [(item[0], item[1].isoformat(), *item[2:]) for item in data["lista_beton"]]
203 serialized_list_beton = json.dumps(get_list_beton_serialize, default=str)
204 try:
205 if data["wenz"] == "zawod":
206 beton = Beton_zawod(
207 id_event_time=time.time(),
208 date_text=data["date_of_day_text"],
209 list_data=serialized_list_beton,
210 day=data["day"],
211 status=0,
212 )
213 elif data["wenz"] == "odola":
214 beton = Beton_odola(
215 id_event_time=time.time(),
216 date_text=data["date_of_day_text"],
217 list_data=serialized_list_beton,
218 day=data["day"],
219 status=0,
220 )
221 elif data["wenz"] == "zeran":
222 beton = Beton_zeran(
223 id_event_time=time.time(),
224 date_text=data["date_of_day_text"],
225 list_data=serialized_list_beton,
226 day=data["day"],
227 status=0,
228 )
229 elif data["wenz"] == "gora":
230 beton = Beton_gora(
231 id_event_time=time.time(),
232 date_text=data["date_of_day_text"],
233 list_data=serialized_list_beton,
234 day=data["day"],
235 status=0,
236 )
238 session.add(beton)
239 session.commit()
240 except IntegrityError as e:
241 lg("Ошибка целостности данных: возможно, дубликат ключа")
242 session.rollback() # Отмена всех изменений в текущей транзакции
244 except Exception as e:
245 lg("Ошибка при добавлении данных:", e)
246 session.rollback()
247 finally:
248 session.close()
251def record_lista(data):
252 """ Inserting data into the list information table
254 Args:
255 data (dictionary): dictionary with elements wenz, day, lista, date_of_day_text
256 """
257 session = Database.Session()
259 get_list_serialize = [(item[0].isoformat(), item[1]) for item in data["lista"]]
260 serialized_list = json.dumps(get_list_serialize, default=str)
261 try:
262 if data["wenz"] == "zawod":
263 lista = Lista_zawod(
264 id_event_time=time.time(),
265 date_text=data["date_of_day_text"],
266 list_data=serialized_list,
267 day=data["day"],
268 status=0,
269 )
270 elif data["wenz"] == "odola":
271 lista = Lista_odola(
272 id_event_time=time.time(),
273 date_text=data["date_of_day_text"],
274 list_data=serialized_list,
275 day=data["day"],
276 status=0,
277 )
278 elif data["wenz"] == "zeran":
279 lista = Lista_zeran(
280 id_event_time=time.time(),
281 date_text=data["date_of_day_text"],
282 list_data=serialized_list,
283 day=data["day"],
284 status=0,
285 )
286 elif data["wenz"] == "gora":
287 lista = Lista_gora(
288 id_event_time=time.time(),
289 date_text=data["date_of_day_text"],
290 list_data=serialized_list,
291 day=data["day"],
292 status=0,
293 )
295 session.add(lista)
296 session.commit()
297 except IntegrityError as e:
298 lg("Data integration error:possible duplicate key")
299 session.rollback() # rollback all changes in the current transaction
301 except Exception as e:
302 lg("Error adding data", e)
303 session.rollback()
304 finally:
305 session.close()
308def delete_records_below_threshold(threshold, base, wenz):
309 """"Deletes all records from [base name] with id_event_time less than [threshold]
311 Args:
312 threshold (float): Time as a float from the beginning of the epoch
313 base_name (str): base name
314 """
316 if base == "beton" and wenz == "zawod":
317 base_name = Beton_zawod
318 elif base == "beton" and wenz == "odola":
319 base_name = Beton_odola
320 elif base == "beton" and wenz == "zeran":
321 base_name = Beton_zeran
322 elif base == "beton" and wenz == "gora":
323 base_name = Beton_gora
324 elif base == "lista" and wenz == "zawod":
325 base_name = Lista_zawod
326 elif base == "lista" and wenz == "odola":
327 base_name = Lista_odola
328 elif base == "lista" and wenz == "zeran":
329 base_name = Lista_zeran
330 elif base == "lista" and wenz == "gora":
331 base_name = Lista_gora
333 session = Database.Session()
335 try:
336 # select records with greaters primary key value
337 records_to_delete = session.query(base_name).filter(base_name.id_event_time < threshold).order_by(base_name.id_event_time).all()
339 # delete selected records
340 for record in records_to_delete:
341 session.delete(record)
343 # confirm changes
344 session.commit()
345 except Exception as e:
346 session.rollback()
347 lg(f"An error occurred: {e}")
348 finally:
349 session.close()
352def get_oldest_list_beton_or_lista(base, date_of_lista_text, wenz):
353 """retriving the oldest list of concrete or schedule
355 Args:
356 base (str): name base - beton or lista
357 date_of_lista (str): date of request '10.02.2020'
358 wenz (str): name of concretes plent
360 Returns:
361 list: list of concrete oeders or schedule
362 """
364 if base == "beton" and wenz == "zawod":
365 base_name = Beton_zawod
366 elif base == "beton" and wenz == "odola":
367 base_name = Beton_odola
368 elif base == "beton" and wenz == "zeran":
369 base_name = Beton_zeran
370 elif base == "beton" and wenz == "gora":
371 base_name = Beton_gora
372 elif base == "lista" and wenz == "zawod":
373 base_name = Lista_zawod
374 elif base == "lista" and wenz == "odola":
375 base_name = Lista_odola
376 elif base == "lista" and wenz == "zeran":
377 base_name = Lista_zeran
378 elif base == "lista" and wenz == "gora":
379 base_name = Lista_gora
381 session = Database.Session()
383 try:
384 result = session.query(base_name.list_data).filter(base_name.date_text == date_of_lista_text).order_by(base_name.id_event_time.asc()).first()
386 if result:
387 if base == "beton":
388 deserialized_list = json.loads(result[0])
389 result_list = [(item[0], time_from_datatime.fromisoformat(item[1]), *item[2:]) for item in deserialized_list]
390 return result_list
392 elif base == "lista":
393 pass
395 return []
397 finally:
398 session.close()
401def get_newest_list_beton_or_lista(base, date_of_lista_text, wenz):
402 """retriving the nevest list of concrete or schedule
404 Args:
405 base (str): name base - beton or lista
406 date_of_lista (str): date of request '10.02.2020'
407 wenz (str): name of concretes plent
409 Returns:
410 list: list of concrete orders or schedule
411 """
413 if base == "beton" and wenz == "zawod":
414 base_name = Beton_zawod
415 elif base == "beton" and wenz == "odola":
416 base_name = Beton_odola
417 elif base == "beton" and wenz == "zeran":
418 base_name = Beton_zeran
419 elif base == "beton" and wenz == "gora":
420 base_name = Beton_gora
421 elif base == "lista" and wenz == "zawod":
422 base_name = Lista_zawod
423 elif base == "lista" and wenz == "odola":
424 base_name = Lista_odola
425 elif base == "lista" and wenz == "zeran":
426 base_name = Lista_zeran
427 elif base == "lista" and wenz == "gora":
428 base_name = Lista_gora
430 session = Database.Session()
432 try:
433 result = session.query(base_name.list_data).filter(base_name.date_text == date_of_lista_text).order_by(base_name.id_event_time.desc()).first()
434 if result:
436 if base == "beton":
437 deserialized_list = json.loads(result[0])
438 result_list = [(item[0], time_from_datatime.fromisoformat(item[1]), *item[2:]) for item in deserialized_list]
439 return result_list
441 elif base == "lista":
442 deserialized_list = json.loads(result[0])
443 result_list = [(time_from_datatime.fromisoformat(item[0]), item[1]) for item in deserialized_list]
444 return result_list
446 return []
448 finally:
449 session.close()
452if __name__ == '__main__':
453 pass
454 # pprint(get_newest_list_beton_or_lista('beton', '03.02.2025', Settings.wenzels[0]))