QIDNLF commited on
Commit
8571ae0
Β·
verified Β·
1 Parent(s): 0cad804

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -63
app.py CHANGED
@@ -124,6 +124,11 @@ def fetch_database_records(std, ver, cat, table_type):
124
 
125
  real_anchors = [c for c in df.columns if any(a.lower() == c.lower() for a in anchors)]
126
 
 
 
 
 
 
127
  final_cols = []
128
  for d in displays:
129
  for c in df.columns:
@@ -432,84 +437,86 @@ def execute_unified_search(base_std, base_ver, base_cat, comp_std, comp_ver, com
432
  s = s[:-2]
433
  return s.replace(" ", "")
434
 
 
435
  internal_rename_b = {c: f"{c}_INTERNAL_BASE" for c in df_base.columns if c != 'merge_key'}
436
  internal_rename_c = {c: f"{c}_INTERNAL_COMP" for c in df_comp.columns if c != 'merge_key'}
437
 
438
  df_base['merge_key'] = df_base[real_anchors_b].apply(lambda row: '-'.join([clean_key_val(x) for x in row]), axis=1)
439
  df_comp['merge_key'] = df_comp[real_anchors_c].apply(lambda row: '-'.join([clean_key_val(x) for x in row]), axis=1)
440
 
441
- is_same_std = (base_std.strip().upper() == comp_std.strip().upper() and type_b.strip().upper() == type_c.strip().upper())
 
 
 
 
 
 
 
 
 
 
 
 
 
442
 
443
- if is_same_std:
444
- all_keys = list(set(df_base['merge_key']).union(set(df_comp['merge_key'])))
445
- bridge = pd.DataFrame({'Base_section': all_keys, 'Comp_section': all_keys})
446
- else:
447
- conn_map = sqlite3.connect(os.path.join(UPLOAD_DIR, "mapping.db"))
448
- registry_query = """
449
- SELECT Target_Table FROM Mapping_registry
450
- WHERE TRIM(Base_std)=? AND TRIM(Base_ver)=? AND TRIM(Comp_std)=? AND TRIM(Comp_ver)=?
451
- LIMIT 1
452
- """
453
- reg_df = pd.read_sql(registry_query, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
454
 
455
- target_table_name = "Mapping_table"
456
- if not reg_df.empty and pd.notna(reg_df.iloc[0]['Target_Table']):
457
- val = str(reg_df.iloc[0]['Target_Table']).strip()
458
- if val and val.lower() not in ["none", "nan"]:
459
- target_table_name = val
460
-
461
- try:
462
- q_fw = f"SELECT * FROM [{target_table_name}] WHERE TRIM(Base_std)=? AND TRIM(Base_ver)=? AND TRIM(Comp_std)=? AND TRIM(Comp_ver)=?"
463
- df_fw = pd.read_sql(q_fw, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
464
-
465
- q_rv = f"SELECT * FROM [{target_table_name}] WHERE TRIM(Comp_std)=? AND TRIM(Comp_ver)=? AND TRIM(Base_std)=? AND TRIM(Base_ver)=?"
466
- df_rv = pd.read_sql(q_rv, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
467
- except Exception as sql_e:
468
- conn_map.close()
469
- return pd.DataFrame({"Error": [f"λ§€ν•‘ '{target_table_name}'을 μ—¬λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. ν…Œμ΄λΈ” 이름을 ν™•μΈν•˜μ„Έμš”: {str(sql_e)}"]})
470
  conn_map.close()
 
 
471
 
472
- cols_fw_lower = {c.lower(): c for c in df_fw.columns}
473
-
474
- if 'base_type' in cols_fw_lower and 'comp_type' in cols_fw_lower:
475
- b_col = cols_fw_lower['base_type']
476
- c_col = cols_fw_lower['comp_type']
477
-
478
- df_fw[b_col] = df_fw[b_col].fillna('Main').astype(str).str.strip().str.upper()
479
- df_fw[c_col] = df_fw[c_col].fillna('Main').astype(str).str.strip().str.upper()
480
- df_fw = df_fw[(df_fw[b_col] == type_b.strip().upper()) & (df_fw[c_col] == type_c.strip().upper())]
481
-
482
- if not df_rv.empty:
483
- df_rv[b_col] = df_rv[b_col].fillna('Main').astype(str).str.strip().str.upper()
484
- df_rv[c_col] = df_rv[c_col].fillna('Main').astype(str).str.strip().str.upper()
485
- df_rv = df_rv[(df_rv[c_col] == type_b.strip().upper()) & (df_rv[b_col] == type_c.strip().upper())]
486
-
487
- b_sec = cols_fw_lower.get('base_section', 'Base_section')
488
- c_sec = cols_fw_lower.get('comp_section', 'Comp_section')
489
 
490
- if b_sec not in df_fw.columns or c_sec not in df_fw.columns:
491
- return pd.DataFrame({"Error": [f"'{target_table_name}' 에 '{b_sec}' λ˜λŠ” '{c_sec}' 열이 μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ†Œλ¬Έμžλ₯Ό ν™•μΈν•˜μ„Έμš”."]})
 
492
 
493
- df_fw = df_fw[[b_sec, c_sec]].rename(columns={b_sec: 'Base_section', c_sec: 'Comp_section'})
494
  if not df_rv.empty:
495
- df_rv = df_rv[[b_sec, c_sec]].rename(columns={b_sec: 'Comp_section', c_sec: 'Base_section'})
496
- else:
497
- df_rv = pd.DataFrame(columns=['Base_section', 'Comp_section'])
498
 
499
- df_mapping = pd.concat([df_fw, df_rv], ignore_index=True)
 
 
 
 
 
 
 
 
 
 
500
 
501
- if not df_mapping.empty:
502
- df_mapping['Base_section'] = df_mapping['Base_section'].astype(str).str.replace('\n', ',').str.split(',')
503
- df_mapping['Comp_section'] = df_mapping['Comp_section'].astype(str).str.replace('\n', ',').str.split(',')
504
- df_mapping = df_mapping.explode('Base_section').explode('Comp_section')
505
-
506
- df_mapping['Base_section'] = df_mapping['Base_section'].apply(clean_key_val)
507
- df_mapping['Comp_section'] = df_mapping['Comp_section'].apply(clean_key_val)
508
-
509
- df_mapping = df_mapping[(df_mapping['Base_section'] != "") & (df_mapping['Comp_section'] != "")]
510
- bridge = df_mapping.dropna().drop_duplicates()
511
- else:
512
- bridge = pd.DataFrame(columns=['Base_section', 'Comp_section'])
 
 
 
 
 
 
 
 
513
 
514
  df_base = df_base.rename(columns=internal_rename_b)
515
  df_comp = df_comp.rename(columns=internal_rename_c)
@@ -556,6 +563,7 @@ def execute_unified_search(base_std, base_ver, base_cat, comp_std, comp_ver, com
556
  if final_df.empty:
557
  return pd.DataFrame({"Info": ["πŸ’‘ μ„ νƒν•˜μ‹  쑰건 간에 λ³€κ²½λœ λ‚΄μš©μ΄ μ—†μŠ΅λ‹ˆλ‹€. (100% 동일)"]})
558
 
 
559
  final_rename_map = {}
560
  for col in final_df.columns:
561
  if col.endswith("_INTERNAL_BASE"):
@@ -575,6 +583,8 @@ def execute_unified_search(base_std, base_ver, base_cat, comp_std, comp_ver, com
575
 
576
  return pd.DataFrame({"Info": ["쑰건을 μ„ νƒν•˜μ„Έμš”."]})
577
  except Exception as e:
 
 
578
  error_msg = str(e)
579
  if "database is locked" in error_msg.lower():
580
  return pd.DataFrame({"Error": ["🚨 DBκ°€ μž κ²¨μžˆμŠ΅λ‹ˆλ‹€! μΌœλ†“μœΌμ‹  'DB Browser' ν”„λ‘œκ·Έλž¨μ„ μ™„μ „νžˆ μ’…λ£Œν•œ λ’€ λ‹€μ‹œ μ‘°νšŒν•΄ μ£Όμ„Έμš”."]})
 
124
 
125
  real_anchors = [c for c in df.columns if any(a.lower() == c.lower() for a in anchors)]
126
 
127
+ # πŸ’‘ [핡심 둜직] Status 열은 UI 상단에 ν‘œκΈ°λ˜λ―€λ‘œ, μ•„λž˜ ν‘œμ—μ„œλŠ” κΉ”λ”ν•˜κ²Œ μ‚­μ œν•©λ‹ˆλ‹€!
128
+ status_cols = [c for c in df.columns if c.lower() == 'status']
129
+ if status_cols:
130
+ df = df.drop(columns=status_cols)
131
+
132
  final_cols = []
133
  for d in displays:
134
  for c in df.columns:
 
437
  s = s[:-2]
438
  return s.replace(" ", "")
439
 
440
+ # πŸ’‘ [핡심 둜직] λ‚΄λΆ€ 처리용 μž„μ‹œ κΌ¬λ¦¬ν‘œλ₯Ό 달아 KeyErrorλ₯Ό μ›μ²œ μ°¨λ‹¨ν•©λ‹ˆλ‹€!
441
  internal_rename_b = {c: f"{c}_INTERNAL_BASE" for c in df_base.columns if c != 'merge_key'}
442
  internal_rename_c = {c: f"{c}_INTERNAL_COMP" for c in df_comp.columns if c != 'merge_key'}
443
 
444
  df_base['merge_key'] = df_base[real_anchors_b].apply(lambda row: '-'.join([clean_key_val(x) for x in row]), axis=1)
445
  df_comp['merge_key'] = df_comp[real_anchors_c].apply(lambda row: '-'.join([clean_key_val(x) for x in row]), axis=1)
446
 
447
+ # πŸ’‘ [핡심 둜직] λ§€ν•‘ μž₯λΆ€(Mapping_registry)λ₯Ό 무쑰건 μ΅œμš°μ„ μœΌλ‘œ κ²€μ‚¬ν•©λ‹ˆλ‹€.
448
+ conn_map = sqlite3.connect(os.path.join(UPLOAD_DIR, "mapping.db"))
449
+ registry_query = """
450
+ SELECT Target_Table FROM Mapping_registry
451
+ WHERE TRIM(Base_std)=? AND TRIM(Base_ver)=? AND TRIM(Comp_std)=? AND TRIM(Comp_ver)=?
452
+ LIMIT 1
453
+ """
454
+ reg_df = pd.read_sql(registry_query, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
455
+
456
+ target_table_name = "Mapping_table"
457
+ if not reg_df.empty and pd.notna(reg_df.iloc[0]['Target_Table']):
458
+ val = str(reg_df.iloc[0]['Target_Table']).strip()
459
+ if val and val.lower() not in ["none", "nan"]:
460
+ target_table_name = val
461
 
462
+ try:
463
+ q_fw = f"SELECT * FROM [{target_table_name}] WHERE TRIM(Base_std)=? AND TRIM(Base_ver)=? AND TRIM(Comp_std)=? AND TRIM(Comp_ver)=?"
464
+ df_fw = pd.read_sql(q_fw, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
 
 
 
 
 
 
 
 
465
 
466
+ q_rv = f"SELECT * FROM [{target_table_name}] WHERE TRIM(Comp_std)=? AND TRIM(Comp_ver)=? AND TRIM(Base_std)=? AND TRIM(Base_ver)=?"
467
+ df_rv = pd.read_sql(q_rv, conn_map, params=[base_std.strip(), base_ver.strip(), comp_std.strip(), comp_ver.strip()])
468
+ except Exception as sql_e:
 
 
 
 
 
 
 
 
 
 
 
 
469
  conn_map.close()
470
+ return pd.DataFrame({"Error": [f"λ§€ν•‘ μž₯λΆ€ '{target_table_name}'을 μ—¬λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. ν…Œμ΄λΈ” 이름을 ν™•μΈν•˜οΏ½οΏ½μš”: {str(sql_e)}"]})
471
+ conn_map.close()
472
 
473
+ cols_fw_lower = {c.lower(): c for c in df_fw.columns}
474
+
475
+ if 'base_type' in cols_fw_lower and 'comp_type' in cols_fw_lower:
476
+ b_col = cols_fw_lower['base_type']
477
+ c_col = cols_fw_lower['comp_type']
 
 
 
 
 
 
 
 
 
 
 
 
478
 
479
+ df_fw[b_col] = df_fw[b_col].fillna('Main').astype(str).str.strip().str.upper()
480
+ df_fw[c_col] = df_fw[c_col].fillna('Main').astype(str).str.strip().str.upper()
481
+ df_fw = df_fw[(df_fw[b_col] == type_b.strip().upper()) & (df_fw[c_col] == type_c.strip().upper())]
482
 
 
483
  if not df_rv.empty:
484
+ df_rv[b_col] = df_rv[b_col].fillna('Main').astype(str).str.strip().str.upper()
485
+ df_rv[c_col] = df_rv[c_col].fillna('Main').astype(str).str.strip().str.upper()
486
+ df_rv = df_rv[(df_rv[c_col] == type_b.strip().upper()) & (df_rv[b_col] == type_c.strip().upper())]
487
 
488
+ b_sec = cols_fw_lower.get('base_section', 'Base_section')
489
+ c_sec = cols_fw_lower.get('comp_section', 'Comp_section')
490
+
491
+ if b_sec not in df_fw.columns or c_sec not in df_fw.columns:
492
+ return pd.DataFrame({"Error": [f"'{target_table_name}' μž₯뢀에 '{b_sec}' λ˜λŠ” '{c_sec}' 열이 μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ†Œλ¬Έμžλ₯Ό ν™•μΈν•˜μ„Έμš”."]})
493
+
494
+ df_fw = df_fw[[b_sec, c_sec]].rename(columns={b_sec: 'Base_section', c_sec: 'Comp_section'})
495
+ if not df_rv.empty:
496
+ df_rv = df_rv[[b_sec, c_sec]].rename(columns={b_sec: 'Comp_section', c_sec: 'Base_section'})
497
+ else:
498
+ df_rv = pd.DataFrame(columns=['Base_section', 'Comp_section'])
499
 
500
+ df_mapping = pd.concat([df_fw, df_rv], ignore_index=True)
501
+
502
+ if not df_mapping.empty:
503
+ df_mapping['Base_section'] = df_mapping['Base_section'].astype(str).str.replace('\n', ',').str.split(',')
504
+ df_mapping['Comp_section'] = df_mapping['Comp_section'].astype(str).str.replace('\n', ',').str.split(',')
505
+ df_mapping = df_mapping.explode('Base_section').explode('Comp_section')
506
+
507
+ df_mapping['Base_section'] = df_mapping['Base_section'].apply(clean_key_val)
508
+ df_mapping['Comp_section'] = df_mapping['Comp_section'].apply(clean_key_val)
509
+
510
+ df_mapping = df_mapping[(df_mapping['Base_section'] != "") & (df_mapping['Comp_section'] != "")]
511
+ bridge = df_mapping.dropna().drop_duplicates()
512
+ else:
513
+ bridge = pd.DataFrame(columns=['Base_section', 'Comp_section'])
514
+
515
+ # πŸ’‘ [핡심 둜직] λ§€ν•‘ μž₯λΆ€κ°€ μ™„λ²½ν•˜κ²Œ λΉ„μ–΄μžˆμ„ λ•Œλ§Œ(즉, 아무것도 μ•ˆ 썼을 λ•Œλ§Œ) μ΅œν›„μ˜ μˆ˜λ‹¨μœΌλ‘œ 1:1 병합
516
+ is_same_std = (base_std.strip().upper() == comp_std.strip().upper() and type_b.strip().upper() == type_c.strip().upper())
517
+ if bridge.empty and is_same_std:
518
+ all_keys = list(set(df_base['merge_key']).union(set(df_comp['merge_key'])))
519
+ bridge = pd.DataFrame({'Base_section': all_keys, 'Comp_section': all_keys})
520
 
521
  df_base = df_base.rename(columns=internal_rename_b)
522
  df_comp = df_comp.rename(columns=internal_rename_c)
 
563
  if final_df.empty:
564
  return pd.DataFrame({"Info": ["πŸ’‘ μ„ νƒν•˜μ‹  쑰건 간에 λ³€κ²½λœ λ‚΄μš©μ΄ μ—†μŠ΅λ‹ˆλ‹€. (100% 동일)"]})
565
 
566
+ # πŸ’‘ [핡심 둜직] ν™”λ©΄ 좜λ ₯ 직전에 μ§€μ €λΆ„ν•œ μž„μ‹œ κΌ¬λ¦¬ν‘œλ₯Ό κΉ”λ”ν•˜κ²Œ λ–Όμ–΄λ²„λ¦½λ‹ˆλ‹€.
567
  final_rename_map = {}
568
  for col in final_df.columns:
569
  if col.endswith("_INTERNAL_BASE"):
 
583
 
584
  return pd.DataFrame({"Info": ["쑰건을 μ„ νƒν•˜μ„Έμš”."]})
585
  except Exception as e:
586
+ import traceback
587
+ traceback.print_exc()
588
  error_msg = str(e)
589
  if "database is locked" in error_msg.lower():
590
  return pd.DataFrame({"Error": ["🚨 DBκ°€ μž κ²¨μžˆμŠ΅λ‹ˆλ‹€! μΌœλ†“μœΌμ‹  'DB Browser' ν”„λ‘œκ·Έλž¨μ„ μ™„μ „νžˆ μ’…λ£Œν•œ λ’€ λ‹€μ‹œ μ‘°νšŒν•΄ μ£Όμ„Έμš”."]})