database_create.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import sqlite3
  2. import os
  3. import shutil
  4. # 定义全局常量
  5. DATABASE_PATH = r'/User/users.db'
  6. AVATAR_DIRECTORY = r'D:\STUDY\Project\jizhouyao\User\avatar'
  7. AVATAR_SOURCE_DIRECTORY = r'D:\STUDY\Project\jizhouyao\User\avatar-source'
  8. AVATAR_TMP_DIRECTORY = 'avatar'
  9. # 确保目录存在
  10. os.makedirs(AVATAR_DIRECTORY, exist_ok=True)
  11. os.makedirs(AVATAR_SOURCE_DIRECTORY, exist_ok=True)
  12. def connect_database():
  13. """连接 SQLite 数据库"""
  14. return sqlite3.connect(DATABASE_PATH)
  15. def create_tables(cursor):
  16. """创建必要的数据库表"""
  17. # 创建 users 表
  18. cursor.execute('''
  19. CREATE TABLE IF NOT EXISTS users (
  20. id INTEGER PRIMARY KEY AUTOINCREMENT,
  21. username TEXT NOT NULL UNIQUE,
  22. password TEXT NOT NULL,
  23. avatar TEXT -- 存储头像文件路径
  24. )
  25. ''')
  26. print("表 'users' 确保已存在!")
  27. # 添加 avatar 字段(如果需要)
  28. try:
  29. cursor.execute("ALTER TABLE users ADD COLUMN avatar TEXT")
  30. print("字段 'avatar' 已添加到 users 表!")
  31. except sqlite3.OperationalError:
  32. print("字段 'avatar' 已存在,无需重复添加!")
  33. # 创建 ceramic_detection_record 表
  34. cursor.execute('''
  35. CREATE TABLE IF NOT EXISTS ceramic_detection_record (
  36. id INTEGER PRIMARY KEY AUTOINCREMENT,
  37. nickname TEXT NOT NULL, -- 用户昵称
  38. detection_time TEXT NOT NULL, -- 检测时间 (ISO 格式)
  39. result TEXT NOT NULL, -- 检测结果
  40. confidence TEXT NOT NULL -- 置信度
  41. )
  42. ''')
  43. print("表 'ceramic_detection_record' 确保已存在!")
  44. # 创建 ai_chat_record 表
  45. cursor.execute('''
  46. CREATE TABLE IF NOT EXISTS ai_chat_record (
  47. id INTEGER PRIMARY KEY AUTOINCREMENT,
  48. nickname TEXT NOT NULL, -- 用户昵称
  49. chat_time TEXT NOT NULL, -- 聊天时间 (ISO 格式)
  50. chat_title TEXT NOT NULL, -- 聊天标题
  51. chat_content TEXT NOT NULL -- 聊天内容(Markdown 格式)
  52. )
  53. ''')
  54. print("表 'ai_chat_record' 确保已存在!")
  55. def save_avatar(username, avatar_source_path):
  56. """保存用户头像文件"""
  57. # 确定目标路径
  58. avatar_destination_path = os.path.join(AVATAR_TMP_DIRECTORY, f'{username}_avatar.jpg')
  59. avatar_destination_path = avatar_destination_path.replace('\\', '/') # 转换路径格式
  60. avatar_source_path = avatar_source_path.replace('\\', '/') # 转换路径格式
  61. try:
  62. # 复制头像到目标文件夹
  63. shutil.copy(avatar_source_path, avatar_destination_path)
  64. print(f"头像文件已保存到: {avatar_destination_path}")
  65. return avatar_destination_path
  66. except FileNotFoundError:
  67. print(f"源头像文件 '{avatar_source_path}' 不存在!")
  68. raise
  69. def insert_user(cursor, username, password, avatar_path):
  70. """插入用户数据到 users 表"""
  71. try:
  72. cursor.execute(
  73. "INSERT INTO users (username, password, avatar) VALUES (?, ?, ?)",
  74. (username, password, avatar_path)
  75. )
  76. print(f"用户 '{username}' 及其头像已保存到数据库!")
  77. except sqlite3.IntegrityError:
  78. print(f"用户 '{username}' 已存在,无需重复创建!")
  79. def query_and_display_users(cursor):
  80. """查询并显示所有用户信息"""
  81. cursor.execute("SELECT id, username, password, avatar FROM users")
  82. users = cursor.fetchall()
  83. print("当前用户信息:")
  84. for user in users:
  85. print(user)
  86. def main():
  87. """主程序逻辑"""
  88. # 数据库连接
  89. conn = connect_database()
  90. cursor = conn.cursor()
  91. # 创建数据库表
  92. create_tables(cursor)
  93. # 用户信息
  94. username = 'pqyyyyy'
  95. password = '031009'
  96. avatar_source_path = os.path.join(AVATAR_SOURCE_DIRECTORY, 'example-avatar.jpg') # 示例头像文件路径
  97. try:
  98. # 保存用户头像文件
  99. avatar_path = save_avatar(username, avatar_source_path)
  100. # 插入用户数据
  101. insert_user(cursor, username, password, avatar_path)
  102. # 提交更改
  103. conn.commit()
  104. except Exception as e:
  105. print(f"发生错误:{e}")
  106. finally:
  107. # 查询并显示用户信息
  108. query_and_display_users(cursor)
  109. # 关闭数据库连接
  110. conn.close()
  111. if __name__ == "__main__":
  112. main()