feat: 数据库合并与查询优化 (#97)

增加性能和查询选项
This commit is contained in:
Zheng Huang 2024-05-22 21:29:40 +08:00 committed by GitHub
parent 0ff56fe695
commit da7072b2c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 4 deletions

View File

@ -247,17 +247,23 @@ class ParsingMSG(DatabaseBase):
"room_name": StrTalker, "content": content, "CreateTime": CreateTime, "id": id} "room_name": StrTalker, "content": content, "CreateTime": CreateTime, "id": id}
return row_data return row_data
def msg_list(self, wxid="", start_index=0, page_size=500): def msg_list(self, wxid="", start_index=0, page_size=500, msg_type: str = ""):
if wxid: if wxid:
sql = ( sql = (
"SELECT localId, IsSender, StrContent, StrTalker, Sequence, Type, SubType,CreateTime,MsgSvrID,DisplayContent,CompressContent,BytesExtra,ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " "SELECT localId, IsSender, StrContent, StrTalker, Sequence, Type, SubType,CreateTime,MsgSvrID,DisplayContent,CompressContent,BytesExtra,ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id "
"FROM MSG WHERE StrTalker=? " "FROM MSG WHERE StrTalker=? "
"ORDER BY CreateTime ASC LIMIT ?,?") "ORDER BY CreateTime ASC LIMIT ?,?")
if msg_type:
sql = sql.replace("ORDER BY CreateTime ASC LIMIT ?,?",
f"AND Type={msg_type} ORDER BY CreateTime ASC LIMIT ?,?")
result1 = self.execute_sql(sql, (wxid, start_index, page_size)) result1 = self.execute_sql(sql, (wxid, start_index, page_size))
else: else:
sql = ( sql = (
"SELECT localId, IsSender, StrContent, StrTalker, Sequence, Type, SubType,CreateTime,MsgSvrID,DisplayContent,CompressContent,BytesExtra,ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " "SELECT localId, IsSender, StrContent, StrTalker, Sequence, Type, SubType,CreateTime,MsgSvrID,DisplayContent,CompressContent,BytesExtra,ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id "
"FROM MSG ORDER BY CreateTime ASC LIMIT ?,?") "FROM MSG ORDER BY CreateTime ASC LIMIT ?,?")
if msg_type:
sql = sql.replace("ORDER BY CreateTime ASC LIMIT ?,?",
f"AND Type={msg_type} ORDER BY CreateTime ASC LIMIT ?,?")
result1 = self.execute_sql(sql, (start_index, page_size)) result1 = self.execute_sql(sql, (start_index, page_size))
if not result1: if not result1:
return [], [] return [], []

View File

@ -72,7 +72,7 @@ class ParsingMicroMsg(DatabaseBase):
def user_list(self, word=None): def user_list(self, word=None):
""" """
获取联系人列表 获取联系人列表
:param MicroMsg_db_path: MicroMsg.db 文件路径 :param word 查询关键字可以是用户名昵称备注描述允许拼音
:return: 联系人列表 :return: 联系人列表
""" """
users = [] users = []
@ -87,6 +87,8 @@ class ParsingMicroMsg(DatabaseBase):
f"OR A.NickName LIKE '%{word}%' " f"OR A.NickName LIKE '%{word}%' "
f"OR A.Remark LIKE '%{word}%' " f"OR A.Remark LIKE '%{word}%' "
f"OR A.Alias LIKE '%{word}%' " f"OR A.Alias LIKE '%{word}%' "
f"OR A.QuanPin LIKE LOWER('%{word}%') "
f"OR LOWER(A.PYInitial) LIKE LOWER('%{word}%') "
# f"OR A.Reserved6 LIKE '%{word}%' " # f"OR A.Reserved6 LIKE '%{word}%' "
"ORDER BY A.NickName DESC;") "ORDER BY A.NickName DESC;")
result = self.execute_sql(sql) result = self.execute_sql(sql)

View File

@ -299,7 +299,7 @@ def merge_db(db_paths, save_path="merge.db", CreateTime: int = 0, endCreateTime:
return save_path return save_path
def decrypt_merge(wx_path, key, outpath="", CreateTime: int = 0, endCreateTime: int = 0) -> (bool, str): def decrypt_merge(wx_path, key, outpath="", CreateTime: int = 0, endCreateTime: int = 0, db_type: list[str] = []) -> (bool, str):
""" """
解密合并数据库 msg.db, microMsg.db, media.db,注意会删除原数据库 解密合并数据库 msg.db, microMsg.db, media.db,注意会删除原数据库
:param wx_path: 微信路径 eg: C:\*******\WeChat Files\wxid_********* :param wx_path: 微信路径 eg: C:\*******\WeChat Files\wxid_*********
@ -319,7 +319,13 @@ def decrypt_merge(wx_path, key, outpath="", CreateTime: int = 0, endCreateTime:
# 分割wx_path的文件名和父目录 # 分割wx_path的文件名和父目录
msg_dir = os.path.dirname(wx_path) msg_dir = os.path.dirname(wx_path)
my_wxid = os.path.basename(wx_path) my_wxid = os.path.basename(wx_path)
db_type = ["MSG", "MediaMSG", "MicroMsg", "OpenIMContact", "OpenIMMedia", "OpenIMMsg", "Favorite"] db_type_set: set[str] = {"MSG", "MediaMSG", "MicroMsg", "OpenIMContact", "OpenIMMedia", "OpenIMMsg", "Favorite"}
if len(db_type) == 0:
db_type = list(db_type_set)
else:
for i in db_type:
if i not in db_type_set:
return False, f"db_type参数错误, 可用选项 {db_type_set}"
# 解密 # 解密
code, wxdbpaths = get_core_db(wx_path, db_type) code, wxdbpaths = get_core_db(wx_path, db_type)
if not code: if not code: