1
1
"""
2
2
SQLite client for Fooocus API
3
3
"""
4
+ import logging
4
5
import os
5
6
import time
6
7
import platform
7
8
from datetime import datetime
8
9
from typing import Optional
9
10
import copy
10
11
11
- from sqlalchemy import Integer , Float , VARCHAR , Boolean , JSON , Text , create_engine
12
+ from sqlalchemy import Integer , Float , VARCHAR , Boolean , JSON , Text , create_engine , text
12
13
from sqlalchemy .orm import declarative_base , Session , Mapped , mapped_column
13
14
14
15
@@ -38,6 +39,9 @@ class GenerateRecord(Base):
38
39
39
40
task_id : Mapped [str ] = mapped_column (VARCHAR (255 ), nullable = False , primary_key = True )
40
41
task_type : Mapped [str ] = mapped_column (Text , nullable = False )
42
+ task_in_queue_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
43
+ task_start_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
44
+ task_finish_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
41
45
result_url : Mapped [str ] = mapped_column (Text , nullable = True )
42
46
finish_reason : Mapped [str ] = mapped_column (Text , nullable = True )
43
47
date_time : Mapped [int ] = mapped_column (Integer , nullable = False )
@@ -75,7 +79,8 @@ class GenerateRecord(Base):
75
79
76
80
def __repr__ (self ) -> str :
77
81
return f"GenerateRecord(task_id={ self .task_id !r} , task_type={ self .task_type !r} , \
78
- result_url={ self .result_url !r} , finish_reason={ self .finish_reason !r} , date_time={ self .date_time !r} , \
82
+ task_in_queue_mills={ self .task_in_queue_mills !r} , task_start_mills={ self .task_start_mills !r} , \
83
+ result_url={ self .result_url !r} , finish_reason={ self .finish_reason !r} , date_time={ self .date_time !r} , task_finish_mills={ self .task_finish_mills !r} , \
79
84
prompt={ self .prompt !r} , negative_prompt={ self .negative_prompt !r} , style_selections={ self .style_selections !r} , performance_selection={ self .performance_selection !r} , \
80
85
aspect_ratios_selection={ self .aspect_ratios_selection !r} , base_model_name={ self .base_model_name !r} , \
81
86
refiner_model_name={ self .refiner_model_name !r} , refiner_switch={ self .refiner_switch !r} , loras={ self .loras !r} , \
@@ -118,6 +123,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
118
123
task_info = {
119
124
"task_id" : obj .task_id ,
120
125
"task_type" : obj .task_type ,
126
+ "task_in_queue_mills" : obj .task_in_queue_mills ,
127
+ "task_start_mills" : obj .task_start_mills ,
128
+ "task_finish_mills" : obj .task_finish_mills ,
121
129
"result_url" : obj .result_url ,
122
130
"finish_reason" : obj .finish_reason ,
123
131
"date_time" : datetime .fromtimestamp (obj .date_time ).strftime (
@@ -126,6 +134,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
126
134
}
127
135
del dict_obj ["task_id" ]
128
136
del dict_obj ["task_type" ]
137
+ del dict_obj ['task_in_queue_mills' ]
138
+ del dict_obj ['task_start_mills' ]
139
+ del dict_obj ['task_finish_mills' ]
129
140
del dict_obj ["result_url" ]
130
141
del dict_obj ["finish_reason" ]
131
142
del dict_obj ["date_time" ]
@@ -144,6 +155,30 @@ def __init__(self, uri: str):
144
155
# 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'
145
156
self .engine = create_engine (uri )
146
157
self .session = Session (self .engine )
158
+ self .add_columns_if_not_exists ()
159
+
160
+ def add_columns_if_not_exists (self ):
161
+ """
162
+ Add new columns but keep old data. This function runs automatically.
163
+ """
164
+ table_name = GenerateRecord .__tablename__
165
+ # Check if the table exists
166
+ result = self .session .execute (
167
+ text (f"SELECT name FROM sqlite_master WHERE type='table' AND name='{ table_name } ';" ))
168
+ if not result .fetchone ():
169
+ return
170
+
171
+ result = self .session .execute (text (f"PRAGMA table_info({ table_name } );" ))
172
+ columns = [row [1 ] for row in result .fetchall ()]
173
+ try :
174
+ if 'task_in_queue_mills' not in columns :
175
+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_in_queue_mills INTEGER DEFAULT 0;" ))
176
+ if 'task_start_mills' not in columns :
177
+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_start_mills INTEGER DEFAULT 0;" ))
178
+ if 'task_finish_mills' not in columns :
179
+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_finish_mills INTEGER DEFAULT 0;" ))
180
+ except Exception as e :
181
+ logging .error (f"add new columns failed { e } " )
147
182
148
183
def store_history (self , record : dict ) -> None :
149
184
"""
@@ -220,14 +255,13 @@ def req_to_dict(req: dict) -> dict:
220
255
221
256
222
257
def add_history (
223
- params : dict , task_type : str , task_id : str , result_url : str , finish_reason : str
258
+ params : dict , task_info : dict , result_url : str , finish_reason : str
224
259
) -> None :
225
260
"""
226
261
Store history to database
227
262
Args:
228
263
params:
229
- task_type:
230
- task_id:
264
+ task_info:
231
265
result_url:
232
266
finish_reason:
233
267
@@ -237,8 +271,8 @@ def add_history(
237
271
adv = copy .deepcopy (params ["advanced_params" ])
238
272
params ["advanced_params" ] = adv .__dict__
239
273
params ["date_time" ] = int (time .time ())
240
- params [ "task_type" ] = task_type
241
- params ["task_id" ] = task_id
274
+ for k , v in task_info . items ():
275
+ params [k ] = v
242
276
params ["result_url" ] = result_url
243
277
params ["finish_reason" ] = finish_reason
244
278
0 commit comments