-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata_migration.py
112 lines (96 loc) · 3.95 KB
/
data_migration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from database import SessionLocal
from models import Monument, Tag, Event, MonumentEvent, DaySlot, MonumentSlot
from data import monuments_data, events_data
from datetime import datetime
def migrate_data():
db = SessionLocal()
# Create tags
tag_map = {}
for monument in monuments_data:
monument_type = monument.get("type")
if monument_type and not db.query(Tag).filter(Tag.tag_name == monument_type).first():
tag = Tag(tag_name=monument_type)
db.add(tag)
db.commit()
db.refresh(tag)
tag_map[monument_type] = tag
# Add monuments with tags
monument_map = {}
for monument_data in monuments_data:
monument = Monument(
name=monument_data["name"],
latitude=monument_data["latitude"],
longitude=monument_data["longitude"],
popularity=monument_data["popularity"],
indoor=monument_data["indoor"],
type = monument_data["type"],
description = monument_data["description"],
image_url = monument_data["image_url"],
location = monument_data["location"]
)
# Link tags
monument_type = monument_data.get("type")
if monument_type and monument_type in tag_map:
monument.tags.append(tag_map[monument_type])
db.add(monument)
db.commit()
db.refresh(monument)
# Store monument for linking events later
monument_map[monument_data["name"]] = monument
# Add events
event_map = {}
for event_data in events_data:
event = Event(
name=event_data["name"],
start_date=datetime.strptime(event_data["start_date"], "%Y-%m-%d"),
end_date=datetime.strptime(event_data["end_date"], "%Y-%m-%d"),
related_type=event_data["related_type"]
)
db.add(event)
db.commit()
db.refresh(event)
event_map[event_data["name"]] = event
# Link monuments and events
for monument_data in monuments_data:
monument = monument_map.get(monument_data["name"])
if monument and "events" in monument_data:
for event_name in monument_data["events"]:
event = event_map.get(event_name)
if event:
# Check if relationship already exists
existing = db.query(MonumentEvent).filter(
MonumentEvent.monument_id == monument.monument_id,
MonumentEvent.event_id == event.event_id
).first()
if not existing:
monument_event = MonumentEvent(
monument_id=monument.monument_id,
event_id=event.event_id,
name=event_name
)
db.add(monument_event)
# Add time slots (morning, afternoon, evening)
time_slots = ["morning", "afternoon", "evening"]
for slot_name in time_slots:
if not db.query(DaySlot).filter_by(slot_name=slot_name).first():
slot = DaySlot(slot_name=slot_name)
db.add(slot)
db.commit()
# Link monuments to their best time slots
slots = {slot.slot_name: slot for slot in db.query(DaySlot).all()}
for monument_data in monuments_data:
if "best_time" in monument_data:
best_time = monument_data["best_time"]
monument = monument_map.get(monument_data["name"])
slot = slots.get(best_time)
if monument and slot:
monument_slot = MonumentSlot(
monument_id=monument.monument_id,
slot_id=slot.slot_id
)
db.add(monument_slot)
db.commit()
db.close()
print("Data migration completed successfully!")
if __name__ == "__main__":
migrate_data()