init.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import os
  2. import mysql.connector
  3. # from dotenv import load_dotenv
  4. # load_dotenv()
  5. # ============================================================
  6. # 第一步:建立数据库连接
  7. # ============================================================
  8. # 使用环境变量管理敏感信息,这是生产级代码的基本规范
  9. # 这里拿到的是幻境中的env
  10. conn = mysql.connector.connect(
  11. host=os.getenv("DB_HOST", "127.0.0.1"),
  12. port=int(os.getenv("DB_PORT", 3306)),
  13. user=os.getenv("DB_USER", "root"),
  14. password=os.getenv("DB_PASSWORD", "admin"),
  15. database=os.getenv("DB_NAME", "analytics_demo"),
  16. charset="utf8mb4", #定义字符集配置,否则Windows 默认编码是 gbk,中文字符在插入数据库前就被转成了 ?,所以数据库里存的就是问号
  17. collation="utf8mb4_unicode_ci",
  18. )
  19. cursor = conn.cursor()
  20. # ============================================================
  21. # 第二步:创建表结构
  22. # ============================================================
  23. # 员工表:存储公司内部人员信息
  24. # 用于分析:部门人数分布、薪资结构、入职趋势等
  25. cursor.execute("""
  26. CREATE TABLE IF NOT EXISTS employees (
  27. id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
  28. name VARCHAR(50) NOT NULL, -- 姓名
  29. department VARCHAR(50) NOT NULL, -- 所属部门
  30. salary DECIMAL(10,2) NOT NULL, -- 月薪(精确到分)
  31. hire_date DATE -- 入职日期
  32. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  33. """)
  34. # 产品表:存储在售商品信息
  35. # 用于分析:品类销售、价格分布、库存预警等
  36. cursor.execute("""
  37. CREATE TABLE IF NOT EXISTS products (
  38. id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
  39. product_name VARCHAR(100) NOT NULL, -- 商品名称
  40. category VARCHAR(50) NOT NULL, -- 商品分类
  41. price DECIMAL(10,2) NOT NULL, -- 单价
  42. stock INT DEFAULT 0 -- 当前库存量
  43. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  44. """)
  45. # 订单表:记录每笔交易
  46. # 用于分析:销售趋势、员工绩效、产品热度等
  47. cursor.execute("""
  48. CREATE TABLE IF NOT EXISTS orders (
  49. id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
  50. employee_id INT NOT NULL, -- 下单员工(外键)
  51. product_id INT NOT NULL, -- 购买商品(外键)
  52. quantity INT NOT NULL, -- 购买数量
  53. order_date DATE NOT NULL, -- 下单日期
  54. FOREIGN KEY (employee_id) REFERENCES employees(id), -- 关联员工表
  55. FOREIGN KEY (product_id) REFERENCES products(id) -- 关联产品表
  56. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  57. """)
  58. # ============================================================
  59. # 第三步:插入演示数据
  60. # ============================================================
  61. # 员工数据:5 个员工,分属 3 个部门
  62. employees_data = [
  63. (1, "张三", "技术部", 20000.00, "2023-01-15"),
  64. (2, "李四", "销售部", 11000.00, "2023-02-20"),
  65. (3, "王五", "技术部", 16000.00, "2022-11-10"),
  66. (4, "赵六", "人力资源", 5000.00, "2023-03-01"),
  67. (5, "钱七", "销售部", 17000.00, "2022-12-05"),
  68. ]
  69. # 产品数据:4 款商品,覆盖 2 个品类
  70. products_data = [
  71. (1, "笔记本电脑", "电子产品", 6999.00, 500),
  72. (2, "机械键盘", "电子产品", 399.00, 1000),
  73. (3, "办公椅", "办公用品", 499.00, 300),
  74. (4, "显示器", "电子产品", 1200.00, 400),
  75. ]
  76. # 订单数据:5 笔订单,模拟真实购买行为
  77. orders_data = [
  78. (1, 1, 1, 2, "2024-01-15"), # 张三买了 2 台笔记本
  79. (2, 2, 2, 15, "2024-01-16"), # 李四买了 15 个键盘
  80. (3, 3, 1, 10, "2024-01-17"), # 王五买了 10 台笔记本
  81. (4, 5, 3, 6, "2024-01-18"), # 钱七买了 6 把办公椅
  82. (5, 2, 4, 5, "2024-01-19"), # 李四买了 5 台显示器
  83. ]
  84. # executemany 批量插入,比逐条 insert 高效得多
  85. cursor.executemany("INSERT IGNORE INTO employees VALUES (%s,%s,%s,%s,%s)", employees_data)
  86. cursor.executemany("INSERT IGNORE INTO products VALUES (%s,%s,%s,%s,%s)", products_data)
  87. cursor.executemany("INSERT IGNORE INTO orders VALUES (%s,%s,%s,%s,%s)", orders_data)
  88. conn.commit()
  89. conn.close()
  90. print("✅ 数据库初始化完成")
  91. print(" - employees 表:5 条员工记录")
  92. print(" - products 表:4 条产品记录")
  93. print(" - orders 表:5 条订单记录")