diff --git a/pywxdump/api/remote_server.py b/pywxdump/api/remote_server.py index df42f16..225c150 100644 --- a/pywxdump/api/remote_server.py +++ b/pywxdump/api/remote_server.py @@ -205,7 +205,7 @@ def msg_count(): db_config = get_conf(g.caf, my_wxid, "db_config") db = DBHandler(db_config) chat_count = db.get_msg_count(wxid) - chat_count1 = db.get_plc_msg_count(wxid) if db.PublicMsg_exist else {} + chat_count1 = db.get_plc_msg_count(wxid) # 合并两个字典,相同key,则将value相加 count = {k: chat_count.get(k, 0) + chat_count1.get(k, 0) for k in list(set(list(chat_count.keys()) + list(chat_count1.keys())))} @@ -235,11 +235,9 @@ def get_msgs(): return ReJson(1002, body=f"start or limit is not int {start} {limit}") db = DBHandler(db_config) - msgs, wxid_list = db.get_msg_list(wxid=wxid, start_index=start, page_size=limit) - if not msgs and db.PublicMsg_exist: - msgs, wxid_list = db.get_plc_msg_list(wxid=wxid, start_index=start, page_size=limit) + msgs, wxid_list = db.get_msgs(wxid=wxid, start_index=start, page_size=limit) wxid_list.append(my_wxid) - user = db.get_user_list(wxids=wxid_list) + user = db.get_user(wxids=wxid_list) return ReJson(0, {"msg_list": msgs, "user_list": user}) diff --git a/pywxdump/db/__init__.py b/pywxdump/db/__init__.py index c067b91..df457c1 100644 --- a/pywxdump/db/__init__.py +++ b/pywxdump/db/__init__.py @@ -27,25 +27,41 @@ class DBHandler(MicroHandler, MediaHandler, OpenIMContactHandler, PublicMsgHandl def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.MSG_exist = self.Msg_tables_exist() - self.Micro_exist = self.Micro_tables_exist() - self.Media_exist = self.Media_tables_exist() - self.OpenIMContact_exist = self.OpenIMContact_tables_exist() - self.PublicMsg_exist = self.PublicMSG_tables_exist() - self.OpenIMMedia_exist = self.OpenIMMedia_tables_exist() - self.Favorite_exist = self.Favorite_tables_exist() - - if self.MSG_exist: # 添加索引 - self.Msg_add_index() - if self.PublicMsg_exist: # 添加索引 - self.PublicMsg_add_index() - if self.Micro_exist: # 添加索引 - self.Micro_add_index() + self.Micro_add_index() + self.Msg_add_index() + self.PublicMsg_add_index() def get_user(self, word=None, wxids=None, labels=None): """ 获取联系人列表 """ - users = self.get_user_list(word=word, wxids=wxids, label_ids=labels) if self.Micro_exist else {} - if self.OpenIMContact_exist: users.update(self.get_im_user_list(word=word, wxids=wxids)) + users = self.get_user_list(word=word, wxids=wxids, label_ids=labels) + users.update(self.get_im_user_list(word=word, wxids=wxids)) return users + + def get_msgs(self, wxid="", start_index=0, page_size=500, msg_type: str = "", msg_sub_type: str = "", + start_createtime=None, end_createtime=None): + """ + 获取聊天记录列表 + :param wxid: wxid + :param start_index: 起始索引 + :param page_size: 页大小 + :param msg_type: 消息类型 + :param msg_sub_type: 消息子类型 + :param start_createtime: 开始时间 + :param end_createtime: 结束时间 + :return: 聊天记录列表 {"id": _id, "MsgSvrID": str(MsgSvrID), "type_name": type_name, "is_sender": IsSender, + "talker": talker, "room_name": StrTalker, "msg": msg, "src": src, "extra": {}, + "CreateTime": CreateTime, } + """ + msgs0, wxid_list0 = self.get_msg_list(wxid=wxid, start_index=start_index, page_size=page_size, + msg_type=msg_type, + msg_sub_type=msg_sub_type, start_createtime=start_createtime, + end_createtime=end_createtime) + msgs1, wxid_list1 = self.get_plc_msg_list(wxid=wxid, start_index=start_index, page_size=page_size, + msg_type=msg_type, + msg_sub_type=msg_sub_type, start_createtime=start_createtime, + end_createtime=end_createtime) + msgs = msgs0 + msgs1 + wxid_list = wxid_list0 + wxid_list1 + return msgs, wxid_list diff --git a/pywxdump/db/dbFavorite.py b/pywxdump/db/dbFavorite.py index e5314d6..a248909 100644 --- a/pywxdump/db/dbFavorite.py +++ b/pywxdump/db/dbFavorite.py @@ -22,16 +22,12 @@ class FavoriteHandler(DatabaseBase): _class_name = "Favorite" Favorite_required_tables = ["FavItems", "FavDataItem", "FavTagDatas", "FavBindTagDatas"] - def Favorite_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.Favorite_required_tables) - def get_tags(self, LocalID): """ return: {LocalID: TagName} """ + if not self.tables_exist("FavTagDatas"): + return {} if LocalID is None: sql = "select LocalID, TagName from FavTagDatas order by ServerSeq" else: @@ -108,6 +104,9 @@ class FavoriteHandler(DatabaseBase): "Rerserved7": "保留字段7" } + if not self.tables_exist(["FavItems", "FavDataItem"]): + return False + sql1 = "select " + ",".join(FavItemsFields.keys()) + " from FavItems order by UpdateTime desc" sql2 = "select " + ",".join(FavDataItemFields.keys()) + " from FavDataItem B order by B.RecId asc" diff --git a/pywxdump/db/dbMSG.py b/pywxdump/db/dbMSG.py index ff70ae9..69c2e7e 100644 --- a/pywxdump/db/dbMSG.py +++ b/pywxdump/db/dbMSG.py @@ -23,23 +23,16 @@ class MsgHandler(DatabaseBase): _class_name = "MSG" MSG_required_tables = ["MSG"] - def Msg_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.MSG_required_tables) - def Msg_add_index(self): """ 添加索引,加快查询速度 """ # 检查是否存在索引 - sql = "CREATE INDEX IF NOT EXISTS idx_MSG_StrTalker ON MSG(StrTalker);" - self.execute(sql) - sql = "CREATE INDEX IF NOT EXISTS idx_MSG_CreateTime ON MSG(CreateTime);" - self.execute(sql) - sql = "CREATE INDEX IF NOT EXISTS idx_MSG_StrTalker_CreateTime ON MSG(StrTalker, CreateTime);" - self.execute(sql) + if not self.tables_exist("MSG"): + return + self.execute("CREATE INDEX IF NOT EXISTS idx_MSG_StrTalker ON MSG(StrTalker);") + self.execute("CREATE INDEX IF NOT EXISTS idx_MSG_CreateTime ON MSG(CreateTime);") + self.execute("CREATE INDEX IF NOT EXISTS idx_MSG_StrTalker_CreateTime ON MSG(StrTalker, CreateTime);") @db_error def get_msg_count(self, wxids: list = ""): @@ -57,6 +50,8 @@ class MsgHandler(DatabaseBase): sql = f"SELECT StrTalker, COUNT(*) FROM MSG GROUP BY StrTalker ORDER BY COUNT(*) DESC;" sql_total = f"SELECT COUNT(*) FROM MSG;" + if not self.tables_exist("MSG"): + return {} result = self.execute(sql) total_ret = self.execute(sql_total) @@ -271,11 +266,8 @@ class MsgHandler(DatabaseBase): "talker": talker, "room_name": StrTalker, "msg": msg, "src": src, "extra": {}, "CreateTime": CreateTime, } """ - sql_base = ("SELECT localId,TalkerId,MsgSvrID,Type,SubType,CreateTime,IsSender,Sequence,StatusEx,FlagEx,Status," - "MsgSequence,StrContent,MsgServerSeq,StrTalker,DisplayContent,Reserved0,Reserved1,Reserved3," - "Reserved4,Reserved5,Reserved6,CompressContent,BytesExtra,BytesTrans,Reserved2," - "ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " - "FROM MSG ") + if not self.tables_exist("MSG"): + return [], [] param = () sql_wxid, param = ("AND StrTalker=? ", param + (wxid,)) if wxid else ("", param) @@ -286,7 +278,11 @@ class MsgHandler(DatabaseBase): sql_end_createtime, param = ("AND CreateTime<=? ", param + (end_createtime,)) if end_createtime else ("", param) sql = ( - f"{sql_base} WHERE 1=1 " + "SELECT localId,TalkerId,MsgSvrID,Type,SubType,CreateTime,IsSender,Sequence,StatusEx,FlagEx,Status," + "MsgSequence,StrContent,MsgServerSeq,StrTalker,DisplayContent,Reserved0,Reserved1,Reserved3," + "Reserved4,Reserved5,Reserved6,CompressContent,BytesExtra,BytesTrans,Reserved2," + "ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " + "FROM MSG WHERE 1=1 " f"{sql_wxid}" f"{sql_type}" f"{sql_sub_type}" @@ -310,6 +306,8 @@ class MsgHandler(DatabaseBase): """ 获取每日聊天记录数量,包括发送者数量、接收者数量和总数。 """ + if not self.tables_exist("MSG"): + return {} if isinstance(start_time, str) and start_time.isdigit(): start_time = int(start_time) if isinstance(end_time, str) and end_time.isdigit(): @@ -355,6 +353,8 @@ class MsgHandler(DatabaseBase): """ 获取聊天记录数量最多的联系人,他们聊天记录数量 """ + if not self.tables_exist("MSG"): + return {} if isinstance(start_time, str) and start_time.isdigit(): start_time = int(start_time) if isinstance(end_time, str) and end_time.isdigit(): diff --git a/pywxdump/db/dbMedia.py b/pywxdump/db/dbMedia.py index bc273b5..32a237f 100644 --- a/pywxdump/db/dbMedia.py +++ b/pywxdump/db/dbMedia.py @@ -13,13 +13,10 @@ class MediaHandler(DatabaseBase): _class_name = "MediaMSG" Media_required_tables = ["Media"] - def Media_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.Media_required_tables) - def get_audio(self, MsgSvrID, is_play=False, is_wave=False, save_path=None, rate=24000): + if not self.tables_exist("Media"): + return False + sql = "select Buf from Media where Reserved0=? " DBdata = self.execute(sql, (MsgSvrID,)) if not DBdata: diff --git a/pywxdump/db/dbMicro.py b/pywxdump/db/dbMicro.py index aa028da..f1d9ca5 100644 --- a/pywxdump/db/dbMicro.py +++ b/pywxdump/db/dbMicro.py @@ -18,39 +18,41 @@ class MicroHandler(DatabaseBase): Micro_required_tables = ["ContactLabel", "Contact", "ContactHeadImgUrl", "Session", "ChatInfo", "ChatRoom", "ChatRoomInfo"] - def Micro_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.Micro_required_tables) - def Micro_add_index(self): """ 添加索引, 加快查询速度 """ # 为 Session 表添加索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_Session_strUsrName_nTime ON Session(strUsrName, nTime);") - self.execute("CREATE INDEX IF NOT EXISTS idx_Session_nOrder ON Session(nOrder);") - self.execute("CREATE INDEX IF NOT EXISTS idx_Session_nTime ON Session(nTime);") + if self.tables_exist("Session"): + self.execute("CREATE INDEX IF NOT EXISTS idx_Session_strUsrName_nTime ON Session(strUsrName, nTime);") + self.execute("CREATE INDEX IF NOT EXISTS idx_Session_nOrder ON Session(nOrder);") + self.execute("CREATE INDEX IF NOT EXISTS idx_Session_nTime ON Session(nTime);") # 为 Contact 表添加索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_Contact_UserName ON Contact(UserName);") + + if self.tables_exist("Contact"): + self.execute("CREATE INDEX IF NOT EXISTS idx_Contact_UserName ON Contact(UserName);") # 为 ContactHeadImgUrl 表添加索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_ContactHeadImgUrl_usrName ON ContactHeadImgUrl(usrName);") + if self.tables_exist('ContactHeadImgUrl'): + self.execute("CREATE INDEX IF NOT EXISTS idx_ContactHeadImgUrl_usrName ON ContactHeadImgUrl(usrName);") # 为 ChatInfo 表添加索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_ChatInfo_Username_LastReadedCreateTime " - "ON ChatInfo(Username, LastReadedCreateTime);") - self.execute("CREATE INDEX IF NOT EXISTS idx_ChatInfo_LastReadedCreateTime ON ChatInfo(LastReadedCreateTime);") + if self.tables_exist('ChatInfo'): + self.execute("CREATE INDEX IF NOT EXISTS idx_ChatInfo_Username_LastReadedCreateTime " + "ON ChatInfo(Username, LastReadedCreateTime);") + self.execute( + "CREATE INDEX IF NOT EXISTS idx_ChatInfo_LastReadedCreateTime ON ChatInfo(LastReadedCreateTime);") # 为 Contact 表添加复合索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_Contact_search " - "ON Contact(UserName, NickName, Remark, Alias, QuanPin, PYInitial, RemarkQuanPin, RemarkPYInitial);") + if self.tables_exist('Contact'): + self.execute("CREATE INDEX IF NOT EXISTS idx_Contact_search " + "ON Contact(UserName, NickName, Remark, Alias, QuanPin, PYInitial, RemarkQuanPin, RemarkPYInitial);") # 为 ChatRoom 和 ChatRoomInfo 表添加索引 - self.execute("CREATE INDEX IF NOT EXISTS idx_ChatRoom_ChatRoomName ON ChatRoom(ChatRoomName);") - self.execute("CREATE INDEX IF NOT EXISTS idx_ChatRoomInfo_ChatRoomName ON ChatRoomInfo(ChatRoomName);") + if self.tables_exist(['ChatRoomInfo', "ChatRoom"]): + self.execute("CREATE INDEX IF NOT EXISTS idx_ChatRoom_ChatRoomName ON ChatRoom(ChatRoomName);") + self.execute("CREATE INDEX IF NOT EXISTS idx_ChatRoomInfo_ChatRoomName ON ChatRoomInfo(ChatRoomName);") @db_error def get_labels(self, id_is_key=True): @@ -59,12 +61,13 @@ class MicroHandler(DatabaseBase): :param id_is_key: id_is_key: True: id作为key,False: name作为key :return: """ - if not self.table_exist.get("ContactLabel", False): - return {} + labels = {} + if not self.tables_exist("ContactLabel"): + return labels sql = "SELECT LabelId, LabelName FROM ContactLabel ORDER BY LabelName ASC;" result = self.execute(sql) if not result: - return [] + return labels if id_is_key: labels = {row[0]: row[1] for row in result} else: @@ -78,6 +81,8 @@ class MicroHandler(DatabaseBase): :return: 会话列表 """ sessions = {} + if not self.tables_exist(["Session", "Contact", "ContactHeadImgUrl"]): + return sessions sql = ( "SELECT S.strUsrName,S.nOrder,S.nUnReadCount, S.strNickName, S.nStatus, S.nIsSend, S.strContent, " "S.nMsgLocalID, S.nMsgStatus, S.nTime, S.nMsgType, S.Reserved2 AS nMsgSubType, C.UserName, C.Alias, " @@ -124,6 +129,8 @@ class MicroHandler(DatabaseBase): :return: 最近聊天的联系人 """ users = [] + if not self.tables_exist(["ChatInfo"]): + return users sql = ( "SELECT A.Username, LastReadedCreateTime, LastReadedSvrId " "FROM ( SELECT Username, MAX(LastReadedCreateTime) AS MaxLastReadedCreateTime FROM ChatInfo " @@ -159,7 +166,8 @@ class MicroHandler(DatabaseBase): label_ids = [label_ids] users = {} - + if not self.tables_exist(["Contact", "ContactHeadImgUrl"]): + return users sql = ( "SELECT A.UserName, A.Alias, A.DelFlag, A.Type, A.VerifyFlag, A.Reserved1, A.Reserved2," "A.Remark, A.NickName, A.LabelIDList, A.ChatRoomType, A.ChatRoomNotify, A.Reserved5," @@ -220,6 +228,9 @@ class MicroHandler(DatabaseBase): if isinstance(roomwxids, str): roomwxids = [roomwxids] + rooms = {} + if not self.tables_exist(["ChatRoom", "ChatRoomInfo"]): + return rooms sql = ( "SELECT A.ChatRoomName,A.UserNameList,A.DisplayNameList,A.ChatRoomFlag,A.IsShowName," "A.SelfDisplayName,A.Reserved2,A.RoomData, " @@ -232,7 +243,6 @@ class MicroHandler(DatabaseBase): if roomwxids: sql = sql.replace(";", f"AND A.UserName IN ('" + "','".join(roomwxids) + "') ;") - rooms = {} result = self.execute(sql) if not result: return rooms diff --git a/pywxdump/db/dbOpenIMContact.py b/pywxdump/db/dbOpenIMContact.py index f100fc8..a323397 100644 --- a/pywxdump/db/dbOpenIMContact.py +++ b/pywxdump/db/dbOpenIMContact.py @@ -13,12 +13,6 @@ class OpenIMContactHandler(DatabaseBase): _class_name = "OpenIMContact" OpenIMContact_required_tables = ["OpenIMContact"] - def OpenIMContact_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.OpenIMContact_required_tables) - def get_im_user_list(self, word=None, wxids=None): """ 获取联系人列表 @@ -27,8 +21,10 @@ class OpenIMContactHandler(DatabaseBase): :param wxids: 微信id列表 :return: 联系人字典 """ + if not self.tables_exist("OpenIMContact"): + return [] if not wxids: - wxids = [] + wxids = {} if isinstance(wxids, str): wxids = [wxids] sql = ("SELECT UserName,NickName,Type,Remark,BigHeadImgUrl,CustomInfoDetail,CustomInfoDetailVisible," @@ -49,7 +45,7 @@ class OpenIMContactHandler(DatabaseBase): result = self.execute(sql) if not result: - return [] + return {} users = {} for row in result: diff --git a/pywxdump/db/dbOpenIMMedia.py b/pywxdump/db/dbOpenIMMedia.py index 4083500..df30f52 100644 --- a/pywxdump/db/dbOpenIMMedia.py +++ b/pywxdump/db/dbOpenIMMedia.py @@ -13,13 +13,9 @@ class OpenIMMediaHandler(DatabaseBase): _class_name = "OpenIMMedia" OpenIMMedia_required_tables = ["OpenIMMedia"] - def OpenIMMedia_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.OpenIMMedia_required_tables) - def get_im_audio(self, MsgSvrID, is_play=False, is_wave=False, save_path=None, rate=24000): + if not self.tables_exist("OpenIMMedia"): + return False sql = "select Buf from OpenIMMedia where Reserved0=? " DBdata = self.execute(sql, (MsgSvrID,)) if not DBdata: diff --git a/pywxdump/db/dbPublicMsg.py b/pywxdump/db/dbPublicMsg.py index 71a0fa0..30b9d23 100644 --- a/pywxdump/db/dbPublicMsg.py +++ b/pywxdump/db/dbPublicMsg.py @@ -32,23 +32,18 @@ class PublicMsgHandler(MsgHandler): _class_name = "PublicMSG" PublicMSG_required_tables = ["PublicMsg"] - @db_error - def PublicMSG_tables_exist(self): - """ - 判断该类所需要的表是否存在 - """ - return self.check_tables_exist(self.PublicMSG_required_tables) - def PublicMsg_add_index(self): """ 添加索引,加快查询速度 """ # 检查是否存在索引 - sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_StrTalker ON MSG(StrTalker);" + if not self.tables_exist("PublicMsg"): + return + sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_StrTalker ON PublicMsg(StrTalker);" self.execute(sql) - sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_CreateTime ON MSG(CreateTime);" + sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_CreateTime ON PublicMsg(CreateTime);" self.execute(sql) - sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_StrTalker_CreateTime ON MSG(StrTalker, CreateTime);" + sql = "CREATE INDEX IF NOT EXISTS idx_PublicMsg_StrTalker_CreateTime ON PublicMsg(StrTalker, CreateTime);" self.execute(sql) @db_error @@ -58,6 +53,8 @@ class PublicMsgHandler(MsgHandler): :param wxids: wxid list :return: 聊天记录数量列表 {wxid: chat_count} """ + if not self.tables_exist("PublicMsg"): + return {} if isinstance(wxids, str): wxids = [wxids] if wxids: @@ -96,11 +93,8 @@ class PublicMsgHandler(MsgHandler): "talker": talker, "room_name": StrTalker, "msg": msg, "src": src, "extra": {}, "CreateTime": CreateTime, } """ - sql_base = ("SELECT localId,TalkerId,MsgSvrID,Type,SubType,CreateTime,IsSender,Sequence,StatusEx,FlagEx,Status," - "MsgSequence,StrContent,MsgServerSeq,StrTalker,DisplayContent,Reserved0,Reserved1,Reserved3," - "Reserved4,Reserved5,Reserved6,CompressContent,BytesExtra,BytesTrans,Reserved2," - "ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " - "FROM PublicMsg ") + if not self.tables_exist("PublicMsg"): + return [], [] param = () sql_wxid, param = ("AND StrTalker=? ", param + (wxid,)) if wxid else ("", param) @@ -111,7 +105,11 @@ class PublicMsgHandler(MsgHandler): sql_end_createtime, param = ("AND CreateTime<=? ", param + (end_createtime,)) if end_createtime else ("", param) sql = ( - f"{sql_base} WHERE 1=1 " + "SELECT localId,TalkerId,MsgSvrID,Type,SubType,CreateTime,IsSender,Sequence,StatusEx,FlagEx,Status," + "MsgSequence,StrContent,MsgServerSeq,StrTalker,DisplayContent,Reserved0,Reserved1,Reserved3," + "Reserved4,Reserved5,Reserved6,CompressContent,BytesExtra,BytesTrans,Reserved2," + "ROW_NUMBER() OVER (ORDER BY CreateTime ASC) AS id " + "FROM PublicMsg WHERE 1=1 " f"{sql_wxid}" f"{sql_type}" f"{sql_sub_type}" diff --git a/pywxdump/db/dbbase.py b/pywxdump/db/dbbase.py index 2c891a9..dfce4e6 100644 --- a/pywxdump/db/dbbase.py +++ b/pywxdump/db/dbbase.py @@ -79,7 +79,7 @@ class DatabaseSingletonBase: class DatabaseBase(DatabaseSingletonBase): _class_name = "DatabaseBase" - table_exist = {} + existed_tables = [] def __init__(self, db_config): """ @@ -91,6 +91,28 @@ class DatabaseBase(DatabaseSingletonBase): """ self.config = db_config self.pool = self.connect(self.config) + self.__get_existed_tables() + + def __get_existed_tables(self): + sql = "SELECT tbl_name FROM sqlite_master WHERE type = 'table' and tbl_name!='sqlite_sequence';" + existing_tables = self.execute(sql) + self.existed_tables = [row[0].lower() for row in existing_tables] + return self.existed_tables + + def tables_exist(self, required_tables: str or list): + """ + 判断该类所需要的表是否存在 + Check if all required tables exist in the database. + Args: + required_tables (list or str): A list of table names or a single table name string. + Returns: + bool: True if all required tables exist, False otherwise. + """ + if isinstance(required_tables, str): + required_tables = [required_tables] + rbool = all(table.lower() in self.existed_tables for table in (required_tables or [])) + if not rbool: db_loger.warning(f"{required_tables=}\n{self.existed_tables=}\n{rbool=}\n") + return rbool def execute(self, sql, params=None): """ @@ -125,20 +147,6 @@ class DatabaseBase(DatabaseSingletonBase): finally: connection.close() - def check_tables_exist(self, required_tables): - """ - 判断该类所需要的表是否存在 - """ - required_tables = required_tables or [] - required_tables_str = "'" + "','".join(required_tables) + "'" - sql = (f"SELECT tbl_name FROM sqlite_master " - f"WHERE type='table' AND tbl_name in ({required_tables_str});") - existing_tables = self.execute(sql) - existing_tables = [row[0] for row in existing_tables] # 将查询结果转换为列表 - self.table_exist = {table: table in existing_tables for table in required_tables} - # 检查所有必需的表是否都在现有表中 - return all(table in existing_tables for table in required_tables) - def close(self): self.pool.close() db_loger.info(f"关闭数据库 - {self.config}")