@@ -102,70 +102,48 @@ def fetch_all(self, table_name):
102
102
return result
103
103
104
104
def insert_json_data_list (self , json_data_list , table_name ):
105
- """JSON 데이터 리스트 삽입 및 업데이트 (MERGE 사용 )"""
105
+ """JSON 데이터 리스트를 Oracle DB에 삽입 (중복 키 무시 )"""
106
106
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 = []
109
119
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
+
169
147
170
148
async def fetch_daily_articles_by_date (self , firm_info : FirmInfo , date_str = None ):
171
149
"""TELEGRAM_URL 갱신이 필요한 레코드 비동기 조회"""
0 commit comments