-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmigrate.py
More file actions
executable file
·340 lines (296 loc) · 17.9 KB
/
Copy pathmigrate.py
File metadata and controls
executable file
·340 lines (296 loc) · 17.9 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
import logging
from sqlalchemy import text
from app import app, db
from models import Session, Campaign
from app import app, db, APP_VERSION
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("migration")
def run_migration():
from config import load_config, save_config
# Version check — skip migrations if already at current version
config = load_config()
last_version = config.get('last_migrated_version')
if last_version == APP_VERSION:
logger.info(f"Schema already at v{APP_VERSION} — skipping migrations.")
return
logger.info(f"Schema version: {last_version or 'unknown'} → {APP_VERSION}. Running migrations...")
with app.app_context():
# 1. Schema Migrations (Columns)
try:
with db.engine.connect() as conn:
# --- Session: session_number ---
try:
conn.execute(text("SELECT session_number FROM session LIMIT 1"))
logger.info("Column 'session_number' already exists in Session.")
except Exception:
logger.info("Adding 'session_number' column to Session...")
conn.execute(text("ALTER TABLE session ADD COLUMN session_number INTEGER DEFAULT 0"))
conn.commit()
# --- Campaign: is_default ---
try:
conn.execute(text("SELECT is_default FROM campaign LIMIT 1"))
logger.info("Column 'is_default' already exists in Campaign.")
except Exception:
logger.info("Adding 'is_default' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN is_default BOOLEAN DEFAULT 0"))
conn.commit()
# --- Campaign: recap_context_enabled ---
try:
conn.execute(text("SELECT recap_context_enabled FROM campaign LIMIT 1"))
logger.info("Column 'recap_context_enabled' already exists in Campaign.")
except Exception:
logger.info("Adding 'recap_context_enabled' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN recap_context_enabled BOOLEAN DEFAULT 0"))
conn.commit()
# --- Campaign: recap_context_count ---
try:
conn.execute(text("SELECT recap_context_count FROM campaign LIMIT 1"))
logger.info("Column 'recap_context_count' already exists in Campaign.")
except Exception:
logger.info("Adding 'recap_context_count' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN recap_context_count INTEGER DEFAULT 3"))
conn.commit()
# --- Campaign: llm_provider ---
try:
conn.execute(text("SELECT llm_provider FROM campaign LIMIT 1"))
logger.info("Column 'llm_provider' already exists in Campaign.")
except Exception:
logger.info("Adding 'llm_provider' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN llm_provider VARCHAR(50) NULL"))
conn.commit()
# --- Campaign: llm_model ---
try:
conn.execute(text("SELECT llm_model FROM campaign LIMIT 1"))
logger.info("Column 'llm_model' already exists in Campaign.")
except Exception:
logger.info("Adding 'llm_model' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN llm_model VARCHAR(100) NULL"))
conn.commit()
# --- Campaign: llm_input_cost ---
try:
conn.execute(text("SELECT llm_input_cost FROM campaign LIMIT 1"))
logger.info("Column 'llm_input_cost' already exists in Campaign.")
except Exception:
logger.info("Adding 'llm_input_cost' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN llm_input_cost FLOAT NULL"))
conn.commit()
# --- Campaign: llm_output_cost ---
try:
conn.execute(text("SELECT llm_output_cost FROM campaign LIMIT 1"))
logger.info("Column 'llm_output_cost' already exists in Campaign.")
except Exception:
logger.info("Adding 'llm_output_cost' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN llm_output_cost FLOAT NULL"))
conn.commit()
# --- Campaign: whisper_model ---
try:
conn.execute(text("SELECT whisper_model FROM campaign LIMIT 1"))
logger.info("Column 'whisper_model' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_model' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_model VARCHAR(50) NULL"))
conn.commit()
# --- Campaign: whisper_threads ---
try:
conn.execute(text("SELECT whisper_threads FROM campaign LIMIT 1"))
logger.info("Column 'whisper_threads' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_threads' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_threads INTEGER NULL"))
conn.commit()
# --- Campaign: whisper_batch_size ---
try:
conn.execute(text("SELECT whisper_batch_size FROM campaign LIMIT 1"))
logger.info("Column 'whisper_batch_size' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_batch_size' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_batch_size INTEGER NULL"))
conn.commit()
# --- Campaign: whisper_beam_size ---
try:
conn.execute(text("SELECT whisper_beam_size FROM campaign LIMIT 1"))
logger.info("Column 'whisper_beam_size' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_beam_size' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_beam_size INTEGER NULL"))
conn.commit()
# --- Campaign: whisper_compute_type ---
try:
conn.execute(text("SELECT whisper_compute_type FROM campaign LIMIT 1"))
logger.info("Column 'whisper_compute_type' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_compute_type' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_compute_type VARCHAR(20) NULL"))
conn.commit()
# --- Campaign: whisper_language ---
try:
conn.execute(text("SELECT whisper_language FROM campaign LIMIT 1"))
logger.info("Column 'whisper_language' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_language' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_language VARCHAR(10) NULL"))
conn.commit()
# --- Campaign: whisper_initial_prompt ---
try:
conn.execute(text("SELECT whisper_initial_prompt FROM campaign LIMIT 1"))
logger.info("Column 'whisper_initial_prompt' already exists in Campaign.")
except Exception:
logger.info("Adding 'whisper_initial_prompt' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_initial_prompt VARCHAR(500) NULL"))
conn.commit()
# --- Campaign: Whisper Condition ---
try:
conn.execute(text("SELECT whisper_condition_on_previous_text FROM campaign LIMIT 1"))
logger.info("Column 'whisper_condition_on_previous_text' already exists.")
except Exception:
logger.info("Adding 'whisper_condition_on_previous_text' column...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_condition_on_previous_text BOOLEAN NULL"))
conn.commit()
# --- Campaign: Whisper Compression ---
try:
conn.execute(text("SELECT whisper_compression_ratio_threshold FROM campaign LIMIT 1"))
logger.info("Column 'whisper_compression_ratio_threshold' already exists.")
except Exception:
logger.info("Adding 'whisper_compression_ratio_threshold' column...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_compression_ratio_threshold FLOAT NULL"))
conn.commit()
# --- Campaign: Whisper No Speech ---
try:
conn.execute(text("SELECT whisper_no_speech_threshold FROM campaign LIMIT 1"))
logger.info("Column 'whisper_no_speech_threshold' already exists.")
except Exception:
logger.info("Adding 'whisper_no_speech_threshold' column...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN whisper_no_speech_threshold FLOAT NULL"))
conn.commit()
# --- Campaign: vad_method ---
try:
conn.execute(text("SELECT vad_method FROM campaign LIMIT 1"))
logger.info("Column 'vad_method' already exists in Campaign.")
except Exception:
logger.info("Adding 'vad_method' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_method VARCHAR(20) NULL"))
conn.commit()
# --- Campaign: vad_onset ---
try:
conn.execute(text("SELECT vad_onset FROM campaign LIMIT 1"))
logger.info("Column 'vad_onset' already exists in Campaign.")
except Exception:
logger.info("Adding 'vad_onset' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_onset FLOAT NULL"))
conn.commit()
# --- Campaign: vad_offset ---
try:
conn.execute(text("SELECT vad_offset FROM campaign LIMIT 1"))
logger.info("Column 'vad_offset' already exists in Campaign.")
except Exception:
logger.info("Adding 'vad_offset' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_offset FLOAT NULL"))
conn.commit()
# --- Campaign: username_map ---
try:
conn.execute(text("SELECT username_map FROM campaign LIMIT 1"))
logger.info("Column 'username_map' already exists in Campaign.")
except Exception:
logger.info("Adding 'username_map' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN username_map TEXT NULL"))
conn.commit()
# --- Campaign: transcript_remove_timestamps ---
try:
conn.execute(text("SELECT transcript_remove_timestamps FROM campaign LIMIT 1"))
logger.info("Column 'transcript_remove_timestamps' already exists in Campaign.")
except Exception:
logger.info("Adding 'transcript_remove_timestamps' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN transcript_remove_timestamps BOOLEAN DEFAULT 0"))
conn.commit()
# --- Campaign: transcript_consolidate_lines ---
try:
conn.execute(text("SELECT transcript_consolidate_lines FROM campaign LIMIT 1"))
logger.info("Column 'transcript_consolidate_lines' already exists in Campaign.")
except Exception:
logger.info("Adding 'transcript_consolidate_lines' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN transcript_consolidate_lines BOOLEAN DEFAULT 0"))
conn.commit()
# --- DiscordLog: session_id ---
try:
conn.execute(text("SELECT session_id FROM discord_log LIMIT 1"))
logger.info("Column 'session_id' already exists in DiscordLog.")
except Exception:
logger.info("Adding 'session_id' column to DiscordLog...")
conn.execute(text("ALTER TABLE discord_log ADD COLUMN session_id INTEGER NULL"))
try:
conn.execute(text(
"ALTER TABLE discord_log ADD CONSTRAINT fk_discord_log_session "
"FOREIGN KEY (session_id) REFERENCES session(id)"
))
except Exception as e:
logger.warning(f"Could not add FK constraint: {e}")
conn.commit()
# --- Session: session_prompt ---
try:
conn.execute(text("SELECT session_prompt FROM session LIMIT 1"))
logger.info("Column 'session_prompt' already exists in Session.")
except Exception:
logger.info("Adding 'session_prompt' column to Session...")
conn.execute(text("ALTER TABLE session ADD COLUMN session_prompt LONGTEXT NULL"))
conn.commit()
# --- Session: session_username_map ---
try:
conn.execute(text("SELECT session_username_map FROM session LIMIT 1"))
logger.info("Column 'session_username_map' already exists in Session.")
except Exception:
logger.info("Adding 'session_username_map' column to Session...")
conn.execute(text("ALTER TABLE session ADD COLUMN session_username_map TEXT NULL"))
conn.commit()
# --- Session: session_remove_timestamps ---
try:
conn.execute(text("SELECT session_remove_timestamps FROM session LIMIT 1"))
logger.info("Column 'session_remove_timestamps' already exists in Session.")
except Exception:
logger.info("Adding 'session_remove_timestamps' column to Session...")
conn.execute(text("ALTER TABLE session ADD COLUMN session_remove_timestamps BOOLEAN NULL"))
conn.commit()
# --- Session: session_consolidate_lines ---
try:
conn.execute(text("SELECT session_consolidate_lines FROM session LIMIT 1"))
logger.info("Column 'session_consolidate_lines' already exists in Session.")
except Exception:
logger.info("Adding 'session_consolidate_lines' column to Session...")
conn.execute(text("ALTER TABLE session ADD COLUMN session_consolidate_lines BOOLEAN NULL"))
conn.commit()
# --- Campaign: New VAD Settings ---
try:
conn.execute(text("SELECT vad_min_silence_ms FROM campaign LIMIT 1"))
logger.info("New VAD columns already exist in Campaign.")
except Exception:
logger.info("Adding new VAD columns to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_min_silence_ms FLOAT NULL"))
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_max_speech_ms FLOAT NULL"))
conn.commit()
# --- Campaign: New VAD Settings (Fix for _s) ---
try:
conn.execute(text("SELECT vad_max_speech_s FROM campaign LIMIT 1"))
logger.info("Column 'vad_max_speech_s' already exists in Campaign.")
except Exception:
logger.info("Adding 'vad_max_speech_s' column to Campaign...")
conn.execute(text("ALTER TABLE campaign ADD COLUMN vad_max_speech_s FLOAT NULL"))
conn.commit()
except Exception as e:
logger.error(f"Error checking/adding columns: {e}")
# 2. Data Backfills
logger.info("Backfilling session numbers...")
campaigns = Campaign.query.all()
for camp in campaigns:
sessions = Session.query.filter_by(campaign_id=camp.id).order_by(Session.session_date).all()
dated = [s for s in sessions if s.session_date is not None]
undated = [s for s in sessions if s.session_date is None]
for session_obj in undated:
session_obj.session_number = 0
for idx, session_obj in enumerate(dated, start=1):
session_obj.session_number = idx
logger.info(f"Updated: {camp.name} - {session_obj.original_filename} -> Session #{idx}")
db.session.commit()
config['last_migrated_version'] = APP_VERSION
save_config(config)
logger.info(f"Migration complete. Version stored as {APP_VERSION}.")
if __name__ == "__main__":
run_migration()