init.py 4.3 KB

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