mysql_client.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. # 导入 MySQL 连接库
  2. import pymysql
  3. # 导入 pandas
  4. import pandas as pd
  5. import sys
  6. from pathlib import Path
  7. # 直接运行本文件时,把项目根目录加入模块搜索路径。
  8. if __package__ in (None, ""):
  9. project_root = Path(__file__).resolve().parents[2]
  10. sys.path.insert(0, str(project_root))
  11. # 导入配置和日志
  12. from base import Config, logger
  13. class MySQLClient:
  14. def __init__(self):
  15. # 初始化日志
  16. self.logger = logger
  17. try:
  18. # 连接 MySQL 数据库
  19. self.connection = pymysql.connect(
  20. host=Config().MYSQL_HOST,
  21. user=Config().MYSQL_USER,
  22. password=Config().MYSQL_PASSWORD,
  23. database=Config().MYSQL_DATABASE,
  24. charset="utf8mb4",
  25. )
  26. # 创建游标
  27. self.cursor = self.connection.cursor()
  28. # 记录连接成功
  29. self.logger.info("MySQL 连接成功")
  30. except pymysql.MySQLError as exc:
  31. # 记录连接失败
  32. self.logger.error(f"MySQL 连接失败: {exc}")
  33. raise
  34. def create_table(self):
  35. create_table_query = """
  36. CREATE TABLE IF NOT EXISTS jpkb (
  37. id INT AUTO_INCREMENT PRIMARY KEY,
  38. subject_name VARCHAR(20),
  39. question VARCHAR(1000),
  40. answer VARCHAR(1000)
  41. )
  42. """
  43. try:
  44. self.cursor.execute(create_table_query)
  45. self.connection.commit()
  46. self.logger.info("表创建成功")
  47. except pymysql.MySQLError as exc:
  48. self.logger.error(f"表创建失败: {exc}")
  49. raise
  50. def insert_data(self, csv_path):
  51. try:
  52. data = pd.read_csv(csv_path)
  53. records = [
  54. (row["知识域"], row["问题"], row["答案"])
  55. for _, row in data.iterrows()
  56. ]
  57. insert_query = (
  58. "INSERT INTO jpkb (subject_name, question, answer) "
  59. "VALUES (%s, %s, %s)"
  60. )
  61. # 删除和重新插入处于同一事务中,失败时可恢复原有数据。
  62. self.cursor.execute("DELETE FROM jpkb")
  63. self.cursor.executemany(insert_query, records)
  64. self.connection.commit()
  65. self.logger.info(f"数据刷新成功,共插入 {len(records)} 条")
  66. except Exception as exc:
  67. self.logger.error(f"数据插入失败: {exc}")
  68. self.connection.rollback()
  69. raise
  70. def fetch_questions(self):
  71. # 获取所有问题
  72. try:
  73. self.cursor.execute("SELECT question FROM jpkb")
  74. results = self.cursor.fetchall()
  75. self.logger.info("成功获取问题")
  76. return results
  77. except pymysql.MySQLError as exc:
  78. self.logger.error(f"查询失败: {exc}")
  79. return []
  80. def fetch_answer(self, question):
  81. # 获取指定问题的答案
  82. try:
  83. self.cursor.execute(
  84. "SELECT answer FROM jpkb WHERE question=%s", (question,)
  85. )
  86. result = self.cursor.fetchone()
  87. return result[0] if result else None
  88. except pymysql.MySQLError as exc:
  89. self.logger.error(f"答案获取失败: {exc}")
  90. return None
  91. def close(self):
  92. # 关闭数据库连接
  93. try:
  94. self.cursor.close()
  95. self.connection.close()
  96. self.logger.info("MySQL 连接已关闭")
  97. except pymysql.MySQLError as exc:
  98. self.logger.error(f"关闭连接失败: {exc}")
  99. if __name__ == "__main__":
  100. mysql_client = MySQLClient()
  101. try:
  102. mysql_client.create_table()
  103. data_file = Path(__file__).resolve().parents[1] / "data" / "JP企业知识库问答.csv"
  104. mysql_client.insert_data(data_file)
  105. finally:
  106. mysql_client.close()