提交 205d2934828f5bf03f3751c51a0c23d63756940a

作者 nheweijun
1 个父辈 8a3b68e3

2021.8.10 14:44 update table_refresh with task

正在显示 1 个修改的文件 包含 143 行增加75 行删除
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 5
6 6
7 import traceback 7 import traceback
8 -from app.models import Table,Database,DES,Columns,db,TableVacuate 8 +from app.models import Table,Database,DES,Columns,db,TableVacuate,Task,Process
9 9
10 from osgeo.ogr import DataSource,FeatureDefn,FieldDefn,Layer 10 from osgeo.ogr import DataSource,FeatureDefn,FieldDefn,Layer
11 11
@@ -20,59 +20,108 @@ from app.util.component.StructuredPrint import StructurePrint @@ -20,59 +20,108 @@ from app.util.component.StructuredPrint import StructurePrint
20 from app.util.component.ApiTemplate import ApiTemplate 20 from app.util.component.ApiTemplate import ApiTemplate
21 from app.util.component.GeometryAdapter import GeometryAdapter 21 from app.util.component.GeometryAdapter import GeometryAdapter
22 22
  23 +import multiprocessing
  24 +import configure
  25 +
23 class Api(ApiTemplate): 26 class Api(ApiTemplate):
24 api_name = "数据刷新" 27 api_name = "数据刷新"
25 def process(self): 28 def process(self):
26 -  
27 -  
28 res = {} 29 res = {}
29 - pg_ds =None  
30 - data_session=None  
31 - this_time = datetime.datetime.now()  
32 try: 30 try:
33 - 31 +
34 database_guid = self.para.get("database_guid") 32 database_guid = self.para.get("database_guid")
35 database = Database.query.filter_by(guid=database_guid).one_or_none() 33 database = Database.query.filter_by(guid=database_guid).one_or_none()
36 - 34 +
37 if not database: 35 if not database:
38 raise Exception("数据库不存在!") 36 raise Exception("数据库不存在!")
39 - spatial_tables = Table.query.order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(Table.table_type!=0).all() 37 + # 初始化task
  38 + task_guid = uuid.uuid1().__str__()
  39 +
  40 + # result = self.table_refresh(database)
  41 +
  42 + refresh_process = multiprocessing.Process(target=self.table_refresh,args=(database,task_guid))
  43 + refresh_process.start()
  44 +
  45 + task = Task(guid=task_guid,
  46 + name="数据库{}更新".format(database.alias),
  47 + create_time=datetime.datetime.now(),
  48 + state=0,
  49 + task_type=3,
  50 + creator=self.para.get("creator"),
  51 + file_name=None,
  52 + database_guid=database.guid,
  53 + process="数据库更新中")
  54 +
  55 + db.session.add(task)
  56 + db.session.commit()
  57 + res["msg"] = "数据库更新已提交!"
  58 + res["data"] = task_guid
  59 + res["result"] = True
  60 +
  61 + except Exception as e:
  62 + print(traceback.format_exc())
  63 + raise e
  64 + return res
  65 +
  66 +
  67 + def table_refresh(self,database,task_guid):
  68 +
  69 + pg_ds =None
  70 + data_session=None
  71 + result = {}
  72 + sys_session = None
  73 + try:
  74 + sys_session = PGUtil.get_db_session(configure.SQLALCHEMY_DATABASE_URI)
  75 +
  76 +
  77 + this_time = datetime.datetime.now()
  78 + database_guid = database.guid
  79 +
  80 + # 已注册空间表
  81 + spatial_tables = sys_session.query(Table).order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(
  82 + Table.table_type != 0).all()
  83 +
  84 + # 已注册空间表名
40 spatial_tables_names = [table.name for table in spatial_tables] 85 spatial_tables_names = [table.name for table in spatial_tables]
41 - db_tables_names = []  
42 -  
43 86
  87 + # 实体库datasource
44 pg_ds: DataSource = PGUtil.open_pg_data_source(1, DES.decode(database.sqlalchemy_uri)) 88 pg_ds: DataSource = PGUtil.open_pg_data_source(1, DES.decode(database.sqlalchemy_uri))
  89 +
45 # 更新空间表 90 # 更新空间表
46 # 增加表 91 # 增加表
47 - self.add_spatail_table(database, pg_ds, spatial_tables_names, db_tables_names, this_time)  
48 - 92 + db_tables_names = self.add_spatail_table(database, pg_ds, sys_session,spatial_tables_names, this_time)# 实体库中空间表名
  93 +
49 # 删除/修改表 94 # 删除/修改表
50 - self.edit_spatial_table(pg_ds, spatial_tables, db_tables_names, this_time) 95 + self.edit_spatial_table(pg_ds, sys_session,spatial_tables, db_tables_names, this_time)
51 96
52 - # 处理抽稀表  
53 - self.deal_vacuate_table(pg_ds,database.guid) 97 + # 空间表处理完毕
  98 + sys_session.commit()
54 99
  100 + # 处理抽稀表
  101 + self.deal_vacuate_table(pg_ds,sys_session, database.guid)
55 102
56 # 空间表处理完毕 103 # 空间表处理完毕
57 - db.session.commit() 104 + sys_session.commit()
58 105
59 -  
60 # 注册普通表 106 # 注册普通表
61 # 实体库连接 107 # 实体库连接
62 data_session: Session = PGUtil.get_db_session(DES.decode(database.sqlalchemy_uri)) 108 data_session: Session = PGUtil.get_db_session(DES.decode(database.sqlalchemy_uri))
63 -  
64 - # 空间表  
65 - spatial_tables = Table.query.order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(Table.table_type!=0).all() 109 +
  110 + # 处理后空间表
  111 + spatial_tables = sys_session.query(Table).order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(
  112 + Table.table_type != 0).all()
  113 + # 处理后空间表名
66 spatial_tables_names = [table.name for table in spatial_tables] 114 spatial_tables_names = [table.name for table in spatial_tables]
67 -  
68 -  
69 - #原有普通表  
70 - common_tables = Table.query.order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(Table.table_type==0).all() 115 +
  116 + # 原有普通表
  117 + common_tables = sys_session.query(Table).order_by(Table.create_time.desc()).filter_by(database_guid=database_guid).filter(
  118 + Table.table_type == 0).all()
  119 + # 原有普通表 名
71 origin_common_tables_name = [table.name for table in common_tables] 120 origin_common_tables_name = [table.name for table in common_tables]
72 -  
73 - 121 +
74 # 现有普通表 122 # 现有普通表
75 - real_common_tables_name =[] 123 + real_common_tables_name = []
  124 +
76 # 只注册public中的表 125 # 只注册public中的表
77 common_result = data_session.execute( 126 common_result = data_session.execute(
78 "select relname as tabname from pg_class c where relkind = 'r' and relnamespace=2200 and relname not like 'pg_%' and relname not like 'sql_%' order by relname").fetchall() 127 "select relname as tabname from pg_class c where relkind = 'r' and relnamespace=2200 and relname not like 'pg_%' and relname not like 'sql_%' order by relname").fetchall()
@@ -80,36 +129,56 @@ class Api(ApiTemplate): @@ -80,36 +129,56 @@ class Api(ApiTemplate):
80 table_name = re[0] 129 table_name = re[0]
81 if table_name not in spatial_tables_names and (not table_name.__contains__("_vacuate_")): 130 if table_name not in spatial_tables_names and (not table_name.__contains__("_vacuate_")):
82 real_common_tables_name.append(table_name) 131 real_common_tables_name.append(table_name)
83 - 132 +
84 # 增加新普通表 133 # 增加新普通表
85 134
86 - self.add_common_table(data_session, database_guid, real_common_tables_name, origin_common_tables_name,  
87 - this_time) 135 + self.add_common_table(data_session, sys_session, database_guid, real_common_tables_name, origin_common_tables_name,
  136 + this_time)
88 137
89 -  
90 - #删除、修改普通表  
91 - self.edit_common_table(data_session, database_guid, real_common_tables_name, origin_common_tables_name,  
92 - this_time) 138 + # 删除、修改普通表
  139 + self.edit_common_table(data_session,sys_session, database_guid, real_common_tables_name, origin_common_tables_name,
  140 + this_time)
93 141
94 - db.session.commit()  
95 - res["msg"] = "刷新数据成功!"  
96 - res["result"] = True 142 + sys_session.commit()
  143 + result["data"] = "刷新数据成功!"
  144 + result["state"] = 1
  145 + sys_session.query(Task).filter_by(guid=task_guid).update(
  146 + {"state": 1, "update_time": datetime.datetime.now(),"process":"更新成功"})
  147 + sys_session.commit()
97 148
98 except Exception as e: 149 except Exception as e:
99 - raise e  
100 - 150 + try:
  151 + print(traceback.format_exc())
  152 + sys_session.query(Task).filter_by(guid=task_guid).update(
  153 + {"state": -1, "update_time": datetime.datetime.now(),"process":"更新失败"})
  154 + message = "{} {}".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), e.__str__())
  155 + task_process_guid = uuid.uuid1().__str__()
  156 + task_process = Process(guid=task_process_guid, message=message, time=datetime.datetime.now(),
  157 + task_guid=task_guid)
  158 + sys_session.add(task_process)
  159 + sys_session.commit()
  160 + except Exception as ee:
  161 + print(traceback.format_exc())
101 finally: 162 finally:
102 if pg_ds: 163 if pg_ds:
103 pg_ds.Destroy() 164 pg_ds.Destroy()
104 if data_session: 165 if data_session:
105 data_session.close() 166 data_session.close()
106 -  
107 - return res  
108 -  
109 -  
110 - def add_spatail_table(self,database,pg_ds,spatial_tables_names,db_tables_names,this_time):  
111 - # 更新空间表  
112 - # 增加表 167 + if sys_session:
  168 + sys_session.close()
  169 + return result
  170 +
  171 + def add_spatail_table(self,database,pg_ds,sys_session,spatial_tables_names,this_time):
  172 + '''
  173 + 注册新增空间表
  174 + :param database:
  175 + :param pg_ds:
  176 + :param spatial_tables_names: 已注册空间表名
  177 + :param this_time:
  178 + :return: 实体库中空间表名
  179 + '''
  180 +
  181 + db_tables_names=[]
113 182
114 for i in range(pg_ds.GetLayerCount()): 183 for i in range(pg_ds.GetLayerCount()):
115 layer: Layer = pg_ds.GetLayer(i) 184 layer: Layer = pg_ds.GetLayer(i)
@@ -123,7 +192,7 @@ class Api(ApiTemplate): @@ -123,7 +192,7 @@ class Api(ApiTemplate):
123 # 只注册public的空间表,其他表空间的表名会有. 192 # 只注册public的空间表,其他表空间的表名会有.
124 if layer.GetName().__contains__("."): 193 if layer.GetName().__contains__("."):
125 continue 194 continue
126 - 195 + # 略过抽稀表
127 if layer.GetName().__contains__("_vacuate_"): 196 if layer.GetName().__contains__("_vacuate_"):
128 continue 197 continue
129 198
@@ -152,14 +221,13 @@ class Api(ApiTemplate): @@ -152,14 +221,13 @@ class Api(ApiTemplate):
152 table_guid = uuid.uuid1().__str__() 221 table_guid = uuid.uuid1().__str__()
153 table = Table(guid=table_guid, 222 table = Table(guid=table_guid,
154 database_guid=database.guid, 223 database_guid=database.guid,
155 - alias=layer.GetName(), 224 + # alias=layer.GetName(),
156 name=layer.GetName(), create_time=this_time, update_time=this_time, 225 name=layer.GetName(), create_time=this_time, update_time=this_time,
157 table_type=GeometryAdapter.get_table_type(layer.GetGeomType()), 226 table_type=GeometryAdapter.get_table_type(layer.GetGeomType()),
158 extent=extent, 227 extent=extent,
159 feature_count=feature_count 228 feature_count=feature_count
160 ) 229 )
161 - db.session.add(table)  
162 - 230 + sys_session.add(table)
163 feature_defn: FeatureDefn = layer.GetLayerDefn() 231 feature_defn: FeatureDefn = layer.GetLayerDefn()
164 232
165 for i in range(feature_defn.GetFieldCount()): 233 for i in range(feature_defn.GetFieldCount()):
@@ -169,9 +237,10 @@ class Api(ApiTemplate): @@ -169,9 +237,10 @@ class Api(ApiTemplate):
169 "") else field_defn.GetAlternativeName() 237 "") else field_defn.GetAlternativeName()
170 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table_guid, 238 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table_guid,
171 name=field_name, alias=field_alias, create_time=this_time, update_time=this_time) 239 name=field_name, alias=field_alias, create_time=this_time, update_time=this_time)
172 - db.session.add(column) 240 + sys_session.add(column)
  241 + return db_tables_names
173 242
174 - def deal_vacuate_table(self,pg_ds,database_guid): 243 + def deal_vacuate_table(self,pg_ds,sys_session,database_guid):
175 244
176 245
177 for i in range(pg_ds.GetLayerCount()): 246 for i in range(pg_ds.GetLayerCount()):
@@ -198,30 +267,30 @@ class Api(ApiTemplate): @@ -198,30 +267,30 @@ class Api(ApiTemplate):
198 except: 267 except:
199 pass 268 pass
200 269
201 - base_table =Table.query.filter_by(name=base_layer_name,database_guid=database_guid).one_or_none() 270 + base_table =sys_session.query(Table).filter_by(name=base_layer_name,database_guid=database_guid).one_or_none()
202 if base_table: 271 if base_table:
203 - if not TableVacuate.query.filter_by(table_guid=base_table.guid,name=l_name).one_or_none(): 272 + if not sys_session.query(TableVacuate).filter_by(table_guid=base_table.guid,name=l_name).one_or_none():
204 table_vacuate = TableVacuate(guid=uuid.uuid1().__str__(), 273 table_vacuate = TableVacuate(guid=uuid.uuid1().__str__(),
205 table_guid=base_table.guid, 274 table_guid=base_table.guid,
206 level=level, 275 level=level,
207 name=l_name, 276 name=l_name,
208 pixel_distance=float(pixel_distance_str)) 277 pixel_distance=float(pixel_distance_str))
209 - db.session.add(table_vacuate)  
210 - Table.query.filter_by(guid=base_table.guid).update({"is_vacuate": 1}) 278 + sys_session.add(table_vacuate)
  279 +
  280 + sys_session.query(Table).filter_by(guid=base_table.guid).update({"is_vacuate": 1})
211 else: 281 else:
212 kk=1 282 kk=1
213 283
214 284
215 285
216 -  
217 - def edit_spatial_table(self,pg_ds,spatial_tables,db_tables_names,this_time): 286 + def edit_spatial_table(self,pg_ds,sys_session,spatial_tables,db_tables_names,this_time):
218 287
219 for table in spatial_tables: 288 for table in spatial_tables:
220 289
221 # 删除表 290 # 删除表
222 if table.name not in db_tables_names: 291 if table.name not in db_tables_names:
223 StructurePrint.print("空间表减少!") 292 StructurePrint.print("空间表减少!")
224 - db.session.delete(table) 293 + sys_session.delete(table)
225 # 修改表 294 # 修改表
226 else: 295 else:
227 layer: Layer = pg_ds.GetLayerByName(table.name) 296 layer: Layer = pg_ds.GetLayerByName(table.name)
@@ -252,15 +321,13 @@ class Api(ApiTemplate): @@ -252,15 +321,13 @@ class Api(ApiTemplate):
252 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid, 321 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid,
253 name=field_name, alias=field_alias, create_time=this_time, 322 name=field_name, alias=field_alias, create_time=this_time,
254 update_time=this_time) 323 update_time=this_time)
255 - db.session.add(column) 324 + sys_session.add(column)
256 325
257 # 删除列 326 # 删除列
258 for column in columns: 327 for column in columns:
259 if column.name not in db_columns_names: 328 if column.name not in db_columns_names:
260 StructurePrint.print("{}空间表属性减少!".format(table.name)) 329 StructurePrint.print("{}空间表属性减少!".format(table.name))
261 - db.session.delete(column)  
262 -  
263 - 330 + sys_session.delete(column)
264 331
265 # 范围统计和数量统计以100w为界限 332 # 范围统计和数量统计以100w为界限
266 query_count_layer: Layer = pg_ds.ExecuteSQL( 333 query_count_layer: Layer = pg_ds.ExecuteSQL(
@@ -271,6 +338,7 @@ class Api(ApiTemplate): @@ -271,6 +338,7 @@ class Api(ApiTemplate):
271 if feature_count < 1000000: 338 if feature_count < 1000000:
272 feature_count = layer.GetFeatureCount() 339 feature_count = layer.GetFeatureCount()
273 ext = layer.GetExtent() 340 ext = layer.GetExtent()
  341 +
274 else: 342 else:
275 query_ext_layer: Layer = pg_ds.ExecuteSQL( 343 query_ext_layer: Layer = pg_ds.ExecuteSQL(
276 "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name, 344 "select geometry(ST_EstimatedExtent('public', '{}','{}'))".format(l_name,
@@ -285,11 +353,11 @@ class Api(ApiTemplate): @@ -285,11 +353,11 @@ class Api(ApiTemplate):
285 # 修改要素量 353 # 修改要素量
286 if not table.feature_count.__eq__(feature_count): 354 if not table.feature_count.__eq__(feature_count):
287 StructurePrint.print("{}空间表要素!".format(table.name)) 355 StructurePrint.print("{}空间表要素!".format(table.name))
288 - Table.query.filter_by(guid=table.guid).update({"feature_count": feature_count, 356 + sys_session.query(Table).filter_by(guid=table.guid).update({"feature_count": feature_count,
289 "extent": extent}) 357 "extent": extent})
290 358
291 359
292 - def add_common_table(self,data_session,database_guid,real_common_tables_name,origin_common_tables_name,this_time): 360 + def add_common_table(self,data_session,sys_session,database_guid,real_common_tables_name,origin_common_tables_name,this_time):
293 for table_name in real_common_tables_name: 361 for table_name in real_common_tables_name:
294 if table_name not in origin_common_tables_name: 362 if table_name not in origin_common_tables_name:
295 StructurePrint.print("{}非空间表增加!".format(table_name)) 363 StructurePrint.print("{}非空间表增加!".format(table_name))
@@ -303,7 +371,7 @@ class Api(ApiTemplate): @@ -303,7 +371,7 @@ class Api(ApiTemplate):
303 feature_count=count 371 feature_count=count
304 ) 372 )
305 373
306 - db.session.add(table) 374 + sys_session.add(table)
307 375
308 sql = ''' 376 sql = '''
309 SELECT 377 SELECT
@@ -325,22 +393,22 @@ class Api(ApiTemplate): @@ -325,22 +393,22 @@ class Api(ApiTemplate):
325 for col in cols: 393 for col in cols:
326 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table_guid, 394 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table_guid,
327 name=col[1], create_time=this_time, update_time=this_time) 395 name=col[1], create_time=this_time, update_time=this_time)
328 - db.session.add(column) 396 + sys_session.add(column)
329 397
330 # 删除不存在的表 398 # 删除不存在的表
331 for n in origin_common_tables_name: 399 for n in origin_common_tables_name:
332 if n not in real_common_tables_name: 400 if n not in real_common_tables_name:
333 tables = Table.query.filter_by(name=n).filter_by(database_guid=database_guid).all() 401 tables = Table.query.filter_by(name=n).filter_by(database_guid=database_guid).all()
334 for table in tables: 402 for table in tables:
335 - db.session.delete(table) 403 + sys_session.delete(table)
336 404
337 - def edit_common_table(self,data_session,database_guid,real_common_tables_name,origin_common_tables_name,this_time): 405 + def edit_common_table(self,data_session,sys_session,database_guid,real_common_tables_name,origin_common_tables_name,this_time):
338 for table_name in origin_common_tables_name: 406 for table_name in origin_common_tables_name:
339 - tables = Table.query.filter_by(name=table_name).filter_by(database_guid=database_guid).all() 407 + tables = sys_session.query(Table).filter_by(name=table_name).filter_by(database_guid=database_guid).all()
340 for table in tables: 408 for table in tables:
341 if table_name not in real_common_tables_name: 409 if table_name not in real_common_tables_name:
342 StructurePrint.print("{}非空间表减少!".format(table_name)) 410 StructurePrint.print("{}非空间表减少!".format(table_name))
343 - db.session.delete(table) 411 + sys_session.delete(table)
344 # 修改表 412 # 修改表
345 else: 413 else:
346 columns = table.relate_columns 414 columns = table.relate_columns
@@ -371,13 +439,13 @@ class Api(ApiTemplate): @@ -371,13 +439,13 @@ class Api(ApiTemplate):
371 StructurePrint.print("{}表要素属性增加!".format(table_name)) 439 StructurePrint.print("{}表要素属性增加!".format(table_name))
372 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid, 440 column = Columns(guid=uuid.uuid1().__str__(), table_guid=table.guid,
373 name=col, create_time=this_time, update_time=this_time) 441 name=col, create_time=this_time, update_time=this_time)
374 - db.session.add(column) 442 + sys_session.add(column)
375 443
376 # 属性减少 444 # 属性减少
377 for column in columns: 445 for column in columns:
378 if column.name not in real_cols_name: 446 if column.name not in real_cols_name:
379 StructurePrint.print("{}表要素属性减少!".format(table_name)) 447 StructurePrint.print("{}表要素属性减少!".format(table_name))
380 - db.session.delete(column) 448 + sys_session.delete(column)
381 449
382 # 修改要素量 450 # 修改要素量
383 sql = 'select count(*) from "{}"'.format(table_name) 451 sql = 'select count(*) from "{}"'.format(table_name)
@@ -385,7 +453,7 @@ class Api(ApiTemplate): @@ -385,7 +453,7 @@ class Api(ApiTemplate):
385 count = data_session.execute(sql).fetchone()[0] 453 count = data_session.execute(sql).fetchone()[0]
386 if not table.feature_count.__eq__(count): 454 if not table.feature_count.__eq__(count):
387 StructurePrint.print("{}表要素变化!".format(table_name)) 455 StructurePrint.print("{}表要素变化!".format(table_name))
388 - Table.query.filter_by(guid=table.guid).update({"feature_count": count}) 456 + sys_session.query(Table).filter_by(guid=table.guid).update({"feature_count": count})
389 457
390 458
391 459
注册登录 后发表评论