видалено колонку km з таблиці stations

This commit is contained in:
Max Lakhman 2025-05-29 20:47:57 +03:00
parent 527552186f
commit 73fa27209f

54
db.py
View File

@ -19,8 +19,7 @@ def init_db():
con.execute(''' con.execute('''
CREATE TABLE IF NOT EXISTS stations ( CREATE TABLE IF NOT EXISTS stations (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL, name TEXT UNIQUE NOT NULL
km REAL
); );
''') ''')
con.execute(''' con.execute('''
@ -38,6 +37,7 @@ def init_db():
''') ''')
con.commit() con.commit()
def save_schedule(entries: List[Dict]): def save_schedule(entries: List[Dict]):
""" """
Зберігає повний розклад. Зберігає повний розклад.
@ -80,13 +80,12 @@ def save_schedule(entries: List[Dict]):
tid = train_ids[idx] tid = train_ids[idx]
for t in e['times']: for t in e['times']:
st = t['station'] st = t['station']
km = t.get('km') # Додаємо лише станцію без колонки km
con.execute(''' con.execute('''
INSERT INTO stations (name, km) INSERT INTO stations (name)
VALUES (?, ?) VALUES (?)
ON CONFLICT(name) DO UPDATE SET ON CONFLICT(name) DO NOTHING
km = COALESCE(excluded.km, stations.km) ''', (st,))
''', (st, km))
station_id = con.execute( station_id = con.execute(
'SELECT id FROM stations WHERE name = ?', 'SELECT id FROM stations WHERE name = ?',
(st,) (st,)
@ -100,42 +99,31 @@ def save_schedule(entries: List[Dict]):
''', (tid, station_id, arr, dep, today)) ''', (tid, station_id, arr, dep, today))
con.commit() con.commit()
def get_schedule(route: Optional[str] = None, travel_date: Optional[str] = None) -> List[Dict]: def get_schedule(route: Optional[str] = None, travel_date: Optional[str] = None) -> List[Dict]:
""" """Повертає розклад поїздів. Якщо вказано route, фільтрує за ним."""
Повертає розклад поїздів. Якщо вказано route, фільтрує за ним.
Повертає список:
[{'train_number': ..., 'route': ..., 'times': [...]}, ...]
"""
from datetime import date as _date from datetime import date as _date
travel_date = travel_date or _date.today().isoformat() travel_date = travel_date or _date.today().isoformat()
with sqlite3.connect(DB_PATH) as con: with sqlite3.connect(DB_PATH) as con:
if route: if route:
rows = con.execute(''' rows = con.execute('''
SELECT tr.train_number, tr.route, st.name, sc.arrival_time, sc.departure_time SELECT tr.train_number, tr.route, st.name, sc.arrival_time, sc.departure_time
FROM schedules sc FROM schedules sc
JOIN trains tr ON sc.train_id = tr.id JOIN trains tr ON sc.train_id = tr.id
JOIN stations st ON sc.station_id = st.id JOIN stations st ON sc.station_id = st.id
WHERE sc.travel_date = ? AND tr.route = ? WHERE sc.travel_date = ? AND tr.route = ?
ORDER BY tr.train_number, st.id ORDER BY tr.train_number, st.id
''', (travel_date, route)).fetchall() ''', (travel_date, route)).fetchall()
else: else:
rows = con.execute(''' rows = con.execute('''
SELECT tr.train_number, tr.route, st.name, sc.arrival_time, sc.departure_time SELECT tr.train_number, tr.route, st.name, sc.arrival_time, sc.departure_time
FROM schedules sc FROM schedules sc
JOIN trains tr ON sc.train_id = tr.id JOIN trains tr ON sc.train_id = tr.id
JOIN stations st ON sc.station_id = st.id JOIN stations st ON sc.station_id = st.id
WHERE sc.travel_date = ? WHERE sc.travel_date = ?
ORDER BY tr.train_number, st.id ORDER BY tr.train_number, st.id
''', (travel_date,)).fetchall() ''', (travel_date,)).fetchall()
schedule: Dict[tuple, List[Dict]] = {} schedule: Dict[tuple, List[Dict]] = {}
for num, rt, station, arrival, departure in rows: for num, rt, station, arrival, departure in rows:
schedule.setdefault((num, rt), []).append({ schedule.setdefault((num, rt), []).append({'station': station, 'arrival': arrival, 'departure': departure})
'station': station, return [{'train_number': num, 'route': rt, 'times': times} for (num, rt), times in schedule.items()]
'arrival': arrival,
'departure': departure
})
return [
{'train_number': num, 'route': rt, 'times': times}
for (num, rt), times in schedule.items()
]