3.22 尝试修复更新bug

This commit is contained in:
zhangsan 2025-03-22 12:06:08 +08:00
parent f8772954f5
commit db9541ba77

View File

@ -19,19 +19,11 @@ class TypechoDirectMysqlPublisher:
self.__init_categories()
def __init_categories(self):
"""
初始化分类列表到 self.__exist_categories
"""
cursor = self.__db.cursor()
sql = f"SELECT mid, name FROM {self.__categories_table_name} WHERE type='category'"
cursor.execute(sql)
results = cursor.fetchall()
self.__exist_categories = []
for item in results:
self.__exist_categories.append({
'mid': item[0],
'name': item[1]
})
self.__exist_categories = [{'mid': item[0], 'name': item[1]} for item in results]
def __get_category_id(self, category_name):
for item in self.__exist_categories:
@ -40,61 +32,39 @@ class TypechoDirectMysqlPublisher:
return -1
def __add_category(self, category_name):
"""
如果分类不存在则插入一条新分类
"""
cursor = self.__db.cursor()
sql = (
f"INSERT INTO {self.__categories_table_name} "
"(`name`, `slug`, `type`, `description`, `count`, `order`, `parent`) "
f"VALUES ('{category_name}', '{category_name}', 'category', '', 0, 1, 0)"
f"VALUES ('{escape_string(category_name)}', '{escape_string(category_name)}', 'category', '', 0, 1, 0)"
)
cursor.execute(sql)
mid = cursor.lastrowid
self.__db.commit()
# 重新初始化分类缓存,避免重复插入
self.__init_categories()
return mid
def __insert_relationship(self, cursor, cid, mid):
"""
typecho_relationships 中插入文章与分类的关联
"""
insert_relationship_sql = (
f"INSERT INTO {self.__relationships_table_name} "
f"(`cid`, `mid`) "
f"VALUES ({cid}, {mid})"
f"INSERT INTO {self.__relationships_table_name} (`cid`, `mid`) VALUES ({cid}, {mid})"
)
cursor.execute(insert_relationship_sql)
def __update_category_count(self, cursor, mid):
"""
分类下文章数 +1
"""
update_category_count_sql = (
f"UPDATE {self.__categories_table_name} SET `count`=`count`+1 WHERE mid={mid}"
)
cursor.execute(update_category_count_sql)
def normalize_content(content):
def normalize_content(self, content):
return content.replace('\r\n', '\n').replace('\r', '\n').strip()
def publish_post(self, title, content, category):
"""
如果 (category, title) 已存在则对比旧内容与新内容
- 若内容相同则跳过更新
- 若内容不同则更新
否则插入新文章
"""
cursor = self.__db.cursor()
# 1. 获取分类 ID若不存在则新建
mid = self.__get_category_id(category)
if mid < 0:
mid = self.__add_category(category)
# 2. 查找同一分类下,是否已存在相同 title 的文章
check_sql = f"""
SELECT c.cid, c.text
FROM {self.__contents_table_name} c
@ -107,51 +77,40 @@ class TypechoDirectMysqlPublisher:
exist_row = cursor.fetchone()
now_time_int = int(time.time())
content_with_mark = '<!--markdown-->' + content # 新内容加上标记
escaped_content = escape_string(content_with_mark)
content_with_mark = '<!--markdown-->' + content
if exist_row:
# ========== 执行更新逻辑 ==========
cid = exist_row[0]
old_content = exist_row[1] or ""
if self.normalize_content(old_content) == self.normalize_content(content_with_mark):
# 内容相同,不更新
print(f"[INFO] 文章已存在且内容未修改: title={title}, cid={cid}, category={category},跳过更新。")
return cid
else:
# 内容不同,执行更新
update_sql = f"""
UPDATE {self.__contents_table_name}
SET modified={now_time_int},
text='{escaped_content}'
text='{escape_string(content_with_mark)}'
WHERE cid={cid}
"""
cursor.execute(update_sql)
print(f"[INFO] 更新文章成功: title={title}, cid={cid}, category={category}")
else:
# ========== 执行插入逻辑 ==========
insert_sql = (
f"INSERT INTO {self.__contents_table_name} "
"(`title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, `template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, `allowPing`, `allowFeed`, `parent`) "
f"VALUES ('{escape_string(title)}', NULL, {now_time_int}, {now_time_int}, '{escaped_content}', 0, 1, NULL, 'post', 'publish', NULL, 0, '1', '1', '1', 0)"
"(`title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, "
"`template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, "
"`allowPing`, `allowFeed`, `parent`) "
f"VALUES ('{escape_string(title)}', NULL, {now_time_int}, {now_time_int}, '{escape_string(content_with_mark)}', "
"0, 1, NULL, 'post', 'publish', NULL, 0, '1', '1', '1', 0)"
)
cursor.execute(insert_sql)
cid = cursor.lastrowid
# slug = cid
update_slug_sql = f"UPDATE {self.__contents_table_name} SET slug={cid} WHERE cid={cid}"
cursor.execute(update_slug_sql)
# 建立文章与分类的关系
self.__insert_relationship(cursor, cid, mid)
# 分类下文章数 +1
self.__update_category_count(cursor, mid)
print(f"[INFO] 插入新文章成功: title={title}, cid={cid}, category={category}")
# 3. 提交事务
self.__db.commit()
return cid