db.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from logger_config import logger
  2. import sqlite3
  3. import os
  4. import datetime
  5. class ConversationDatabaseManage:
  6. def __init__(self):
  7. self.logger = logger
  8. self.db_file = 'chat_history.db'
  9. self.conn = None
  10. self.cursor = None
  11. # 初始化数据库表
  12. if not os.path.exists(self.db_file):
  13. self.logger.info(f"创建新的数据库文件: {self.db_file}")
  14. self.create_table()
  15. def create_table(self):
  16. """创建数据库表"""
  17. try:
  18. self.conn = sqlite3.connect(self.db_file)
  19. self.cursor = self.conn.cursor()
  20. # 创建表
  21. create_table_query = """
  22. CREATE TABLE IF NOT EXISTS intent_recognition_records (
  23. id TEXT,
  24. record TEXT NOT NULL PRIMARY KEY,
  25. time TEXT NOT NULL,
  26. label INTEGER DEFAULT 0
  27. )
  28. """
  29. self.cursor.execute(create_table_query)
  30. self.conn.commit()
  31. self.logger.info("数据库表创建成功")
  32. except Exception as e:
  33. self.logger.error(f"创建数据库表时出错: {str(e)}")
  34. finally:
  35. if self.conn:
  36. self.conn.close()
  37. self.conn = None
  38. self.cursor = None
  39. self.logger.info("数据库连接已关闭")
  40. def insert_record(self, id_:str, record:str, time):
  41. """插入一条记录"""
  42. try:
  43. # 如果是datetime对象,转换为字符串
  44. if isinstance(time, datetime.datetime):
  45. time_str = time.strftime('%Y-%m-%d %H:%M:%S')
  46. elif isinstance(time, int):
  47. # 将时间戳转换为UTC时间字符串
  48. time_str = datetime.datetime.fromtimestamp(time, tz=datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')
  49. else:
  50. time_str = str(time)
  51. self.conn.execute('BEGIN')
  52. # 检查record是否已存在
  53. check_query = """
  54. SELECT 1 FROM intent_recognition_records
  55. WHERE record = ?
  56. """
  57. self.cursor.execute(check_query, (record,))
  58. if self.cursor.fetchone():
  59. self.logger.info(f"record已存在,跳过: {record}")
  60. self.conn.commit() # 提交只读事务,避免事务挂起
  61. return True
  62. insert_query = """
  63. INSERT INTO intent_recognition_records (id, record, time) VALUES (?, ?, ?)
  64. """
  65. self.cursor.execute(insert_query, (id_, record, time_str))
  66. self.conn.commit()
  67. self.logger.info(f"成功插入一条记录: {id_}-{time_str}")
  68. return True
  69. except Exception as e:
  70. self.conn.rollback()
  71. self.logger.error(f"插入记录时出错,已回滚事务: {str(e)} ")
  72. return False
  73. def connect(self):
  74. """建立数据库连接(私有方法)"""
  75. try:
  76. self.conn = sqlite3.connect(self.db_file)
  77. self.cursor = self.conn.cursor()
  78. self.logger.info("数据库连接建立成功")
  79. except Exception as e:
  80. self.logger.error(f"数据库连接失败: {str(e)}")
  81. raise
  82. def close(self):
  83. """手动关闭数据库连接"""
  84. if self.conn:
  85. self.conn.close()
  86. self.conn = None
  87. self.cursor = None
  88. self.logger.info("数据库连接已关闭")
  89. def __del__(self):
  90. """析构函数,确保连接被关闭"""
  91. self.close()
  92. def __enter__(self):
  93. self.connect()
  94. return self
  95. def __exit__(self, exc_type, exc_value, traceback):
  96. self.close()
  97. if __name__ == '__main__':
  98. db = ConversationDatabaseManage()
  99. with db:
  100. db.insert_record('1', 'test', datetime.datetime.now())