From 33e31555998451301f0c1c41c2cb8e75f7a60bf1 Mon Sep 17 00:00:00 2001 From: oscarz Date: Tue, 18 Mar 2025 18:23:28 +0800 Subject: [PATCH] modify scripts --- aabook/src/sqlite_utils.py | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/aabook/src/sqlite_utils.py b/aabook/src/sqlite_utils.py index 400aa0d..0c5f01b 100644 --- a/aabook/src/sqlite_utils.py +++ b/aabook/src/sqlite_utils.py @@ -17,8 +17,10 @@ tbl_name_section = 'books_sections' # 检查 SQLite 版本 +lower_sqlite_version = False sqlite_version = sqlite3.sqlite_version_info if sqlite_version < (3, 24, 0): + lower_sqlite_version = True logging.warning(f"当前 SQLite 版本低于 3.24.0,可能不支持 ON CONFLICT 子句。 {sqlite_version}") # 获取表的列名和默认值 @@ -59,6 +61,9 @@ def check_and_process_data(data, tbl_name): # 插入或更新数据 def insert_or_update_common(data, tbl_name, uniq_key='href'): + if lower_sqlite_version: + return insert_or_update_common_lower(data, tbl_name, uniq_key) + try: processed_data = check_and_process_data(data, tbl_name) if processed_data is None: @@ -85,6 +90,41 @@ def insert_or_update_common(data, tbl_name, uniq_key='href'): logging.error(f"Error inserting or updating data: {e}") return None +# 插入或更新数据 +def insert_or_update_common_lower(data, tbl_name, uniq_key='href'): + try: + processed_data = check_and_process_data(data, tbl_name) + if processed_data is None: + return None + + columns = ', '.join(processed_data.keys()) + values = list(processed_data.values()) + placeholders = ', '.join(['?' for _ in values]) + + # 先尝试插入数据 + try: + sql = f''' + INSERT INTO {tbl_name} ({columns}, updated_at) + VALUES ({placeholders}, datetime('now', 'localtime')) + ''' + cursor.execute(sql, values) + conn.commit() + except sqlite3.IntegrityError: # 唯一键冲突,执行更新操作 + update_clause = ', '.join([f"{col}=?" for col in processed_data.keys() if col != uniq_key]) + ', updated_at=datetime(\'now\', \'localtime\')' + update_values = [processed_data[col] for col in processed_data.keys() if col != uniq_key] + update_values.append(data[uniq_key]) + sql = f"UPDATE {tbl_name} SET {update_clause} WHERE {uniq_key} = ?" + cursor.execute(sql, update_values) + conn.commit() + + # 获取插入或更新后的 report_id + cursor.execute(f"SELECT id FROM {tbl_name} WHERE {uniq_key} = ?", (data[uniq_key],)) + report_id = cursor.fetchone()[0] + return report_id + except sqlite3.Error as e: + logging.error(f"Error inserting or updating data: {e}") + return None + # 插入books表,并判断是否需要更新 def insert_books_index(data):