Skip to content

Commit 68843df

Browse files
committed
OracleManagerSQL: JSON 데이터 리스트 삽입 로직을 MERGE에서 중복 키 무시로 변경
1 parent cbf8fd9 commit 68843df

File tree

1 file changed

+40
-62
lines changed

1 file changed

+40
-62
lines changed

models/OracleManagerSQL.py

Lines changed: 40 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -102,70 +102,48 @@ def fetch_all(self, table_name):
102102
return result
103103

104104
def insert_json_data_list(self, json_data_list, table_name):
105-
"""JSON 데이터 리스트 삽입 및 업데이트 (MERGE 사용)"""
105+
"""JSON 데이터 리스트를 Oracle DB에 삽입 (중복 키 무시)"""
106106
self.open_connection()
107-
inserted_count = 0
108-
updated_count = 0
107+
query = f"""
108+
INSERT /*+ ignore_row_on_dupkey_index({table_name}, KEY) */
109+
INTO {table_name} (
110+
SEC_FIRM_ORDER, ARTICLE_BOARD_ORDER, FIRM_NM, REG_DT,
111+
ATTACH_URL, ARTICLE_TITLE, ARTICLE_URL, MAIN_CH_SEND_YN,
112+
DOWNLOAD_URL, TELEGRAM_URL, WRITER, MKT_TP, KEY, SAVE_TIME
113+
) VALUES (
114+
:SEC_FIRM_ORDER, :ARTICLE_BOARD_ORDER, :FIRM_NM, :REG_DT,
115+
:ATTACH_URL, :ARTICLE_TITLE, :ARTICLE_URL, :MAIN_CH_SEND_YN,
116+
:DOWNLOAD_URL, :TELEGRAM_URL, :WRITER, :MKT_TP, :KEY, :SAVE_TIME
117+
)"""
118+
params_list = []
109119
for entry in json_data_list:
110-
merge_query = f"""
111-
MERGE INTO {table_name} t
112-
USING (SELECT :key AS KEY FROM dual) s
113-
ON (t.KEY = s.KEY)
114-
WHEN MATCHED THEN
115-
UPDATE SET
116-
REG_DT = :reg_dt,
117-
WRITER = :writer,
118-
MKT_TP = :mkt_tp,
119-
DOWNLOAD_URL = CASE
120-
WHEN :download_url IS NOT NULL AND :download_url != ''
121-
THEN :download_url
122-
ELSE t.DOWNLOAD_URL
123-
END,
124-
TELEGRAM_URL = CASE
125-
WHEN :telegram_url IS NOT NULL AND :telegram_url != ''
126-
THEN :telegram_url
127-
ELSE t.TELEGRAM_URL
128-
END
129-
WHEN NOT MATCHED THEN
130-
INSERT (
131-
SEC_FIRM_ORDER, ARTICLE_BOARD_ORDER, FIRM_NM, REG_DT,
132-
ATTACH_URL, ARTICLE_TITLE, ARTICLE_URL, MAIN_CH_SEND_YN,
133-
DOWNLOAD_URL, TELEGRAM_URL, WRITER, MKT_TP, KEY, SAVE_TIME
134-
)
135-
VALUES (
136-
:sec_firm_order, :article_board_order, :firm_nm, :reg_dt,
137-
:attach_url, :article_title, :article_url, :main_ch_send_yn,
138-
:download_url, :telegram_url, :writer, :mkt_tp, :key, :save_time
139-
)
140-
"""
141-
params = {
142-
"sec_firm_order": entry["SEC_FIRM_ORDER"],
143-
"article_board_order": entry["ARTICLE_BOARD_ORDER"],
144-
"firm_nm": entry["FIRM_NM"],
145-
"reg_dt": entry.get("REG_DT", ""),
146-
"attach_url": entry.get("ATTACH_URL", ""),
147-
"article_title": entry["ARTICLE_TITLE"],
148-
"article_url": entry.get("ARTICLE_URL", None),
149-
"main_ch_send_yn": entry.get("MAIN_CH_SEND_YN", "N"),
150-
"download_url": entry.get("DOWNLOAD_URL", None),
151-
"telegram_url": entry.get("TELEGRAM_URL", None),
152-
"writer": entry.get("WRITER", ""),
153-
"mkt_tp": entry.get("MKT_TP", "KR"),
154-
"key": entry.get("KEY") or entry.get("ATTACH_URL", ""),
155-
"save_time": entry["SAVE_TIME"]
156-
}
157-
self.cursor.execute(merge_query, params)
158-
if self.cursor.rowcount > 0:
159-
self.cursor.execute(f"SELECT COUNT(*) FROM {table_name} WHERE KEY = :key", {"key": params["key"]})
160-
if self.cursor.fetchone()[0] == 1:
161-
inserted_count += 1
162-
else:
163-
updated_count += 1
164-
self.conn.commit()
165-
self.close_connection()
166-
print(f"Oracle: Data inserted successfully: {inserted_count} rows.")
167-
print(f"Oracle: Data updated successfully: {updated_count} rows.")
168-
return inserted_count, updated_count
120+
key_val = entry.get("KEY") or entry.get("ATTACH_URL", "")
121+
params_list.append({
122+
"SEC_FIRM_ORDER": entry["SEC_FIRM_ORDER"],
123+
"ARTICLE_BOARD_ORDER": entry["ARTICLE_BOARD_ORDER"],
124+
"FIRM_NM": entry["FIRM_NM"],
125+
"REG_DT": entry.get("REG_DT", ""),
126+
"ATTACH_URL": entry.get("ATTACH_URL", ""),
127+
"ARTICLE_TITLE": entry["ARTICLE_TITLE"],
128+
"ARTICLE_URL": entry.get("ARTICLE_URL"),
129+
"MAIN_CH_SEND_YN": entry.get("MAIN_CH_SEND_YN", "N"),
130+
"DOWNLOAD_URL": entry.get("DOWNLOAD_URL"),
131+
"TELEGRAM_URL": entry.get("TELEGRAM_URL"),
132+
"WRITER": entry.get("WRITER", ""),
133+
"MKT_TP": entry.get("MKT_TP", "KR"),
134+
"KEY": key_val,
135+
"SAVE_TIME": entry["SAVE_TIME"]
136+
})
137+
try:
138+
self.cursor.executemany(query, params_list)
139+
self.conn.commit()
140+
print(f"Inserted {len(params_list)} rows (duplicates ignored).")
141+
except oracledb.DatabaseError as e:
142+
print(f"Error during insert: {e}")
143+
finally:
144+
self.close_connection()
145+
return len(params_list)
146+
169147

170148
async def fetch_daily_articles_by_date(self, firm_info: FirmInfo, date_str=None):
171149
"""TELEGRAM_URL 갱신이 필요한 레코드 비동기 조회"""

0 commit comments

Comments
 (0)