|
@@ -0,0 +1,105 @@
|
|
|
|
|
+import os
|
|
|
|
|
+import mysql.connector
|
|
|
|
|
+# from dotenv import load_dotenv
|
|
|
|
|
+# load_dotenv()
|
|
|
|
|
+
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 第一步:建立数据库连接
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 使用环境变量管理敏感信息,这是生产级代码的基本规范
|
|
|
|
|
+# 这里拿到的是幻境中的env
|
|
|
|
|
+conn = mysql.connector.connect(
|
|
|
|
|
+ host=os.getenv("DB_HOST", "127.0.0.1"),
|
|
|
|
|
+ port=int(os.getenv("DB_PORT", 3306)),
|
|
|
|
|
+ user=os.getenv("DB_USER", "root"),
|
|
|
|
|
+ password=os.getenv("DB_PASSWORD", "admin"),
|
|
|
|
|
+ database=os.getenv("DB_NAME", "analytics_demo"),
|
|
|
|
|
+ charset="utf8mb4", #定义字符集配置,否则Windows 默认编码是 gbk,中文字符在插入数据库前就被转成了 ?,所以数据库里存的就是问号
|
|
|
|
|
+ collation="utf8mb4_unicode_ci",
|
|
|
|
|
+)
|
|
|
|
|
+cursor = conn.cursor()
|
|
|
|
|
+
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 第二步:创建表结构
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+
|
|
|
|
|
+# 员工表:存储公司内部人员信息
|
|
|
|
|
+# 用于分析:部门人数分布、薪资结构、入职趋势等
|
|
|
|
|
+cursor.execute("""
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS employees (
|
|
|
|
|
+ id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
|
|
|
|
|
+ name VARCHAR(50) NOT NULL, -- 姓名
|
|
|
|
|
+ department VARCHAR(50) NOT NULL, -- 所属部门
|
|
|
|
|
+ salary DECIMAL(10,2) NOT NULL, -- 月薪(精确到分)
|
|
|
|
|
+ hire_date DATE -- 入职日期
|
|
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
|
+""")
|
|
|
|
|
+
|
|
|
|
|
+# 产品表:存储在售商品信息
|
|
|
|
|
+# 用于分析:品类销售、价格分布、库存预警等
|
|
|
|
|
+cursor.execute("""
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS products (
|
|
|
|
|
+ id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
|
|
|
|
|
+ product_name VARCHAR(100) NOT NULL, -- 商品名称
|
|
|
|
|
+ category VARCHAR(50) NOT NULL, -- 商品分类
|
|
|
|
|
+ price DECIMAL(10,2) NOT NULL, -- 单价
|
|
|
|
|
+ stock INT DEFAULT 0 -- 当前库存量
|
|
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
|
+""")
|
|
|
|
|
+
|
|
|
|
|
+# 订单表:记录每笔交易
|
|
|
|
|
+# 用于分析:销售趋势、员工绩效、产品热度等
|
|
|
|
|
+cursor.execute("""
|
|
|
|
|
+CREATE TABLE IF NOT EXISTS orders (
|
|
|
|
|
+ id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
|
|
|
|
|
+ employee_id INT NOT NULL, -- 下单员工(外键)
|
|
|
|
|
+ product_id INT NOT NULL, -- 购买商品(外键)
|
|
|
|
|
+ quantity INT NOT NULL, -- 购买数量
|
|
|
|
|
+ order_date DATE NOT NULL, -- 下单日期
|
|
|
|
|
+ FOREIGN KEY (employee_id) REFERENCES employees(id), -- 关联员工表
|
|
|
|
|
+ FOREIGN KEY (product_id) REFERENCES products(id) -- 关联产品表
|
|
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
|
|
|
+""")
|
|
|
|
|
+
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+# 第三步:插入演示数据
|
|
|
|
|
+# ============================================================
|
|
|
|
|
+
|
|
|
|
|
+# 员工数据:5 个员工,分属 3 个部门
|
|
|
|
|
+employees_data = [
|
|
|
|
|
+ (1, "张三", "技术部", 20000.00, "2023-01-15"),
|
|
|
|
|
+ (2, "李四", "销售部", 11000.00, "2023-02-20"),
|
|
|
|
|
+ (3, "王五", "技术部", 16000.00, "2022-11-10"),
|
|
|
|
|
+ (4, "赵六", "人力资源", 5000.00, "2023-03-01"),
|
|
|
|
|
+ (5, "钱七", "销售部", 17000.00, "2022-12-05"),
|
|
|
|
|
+]
|
|
|
|
|
+
|
|
|
|
|
+# 产品数据:4 款商品,覆盖 2 个品类
|
|
|
|
|
+products_data = [
|
|
|
|
|
+ (1, "笔记本电脑", "电子产品", 6999.00, 500),
|
|
|
|
|
+ (2, "机械键盘", "电子产品", 399.00, 1000),
|
|
|
|
|
+ (3, "办公椅", "办公用品", 499.00, 300),
|
|
|
|
|
+ (4, "显示器", "电子产品", 1200.00, 400),
|
|
|
|
|
+]
|
|
|
|
|
+
|
|
|
|
|
+# 订单数据:5 笔订单,模拟真实购买行为
|
|
|
|
|
+orders_data = [
|
|
|
|
|
+ (1, 1, 1, 2, "2024-01-15"), # 张三买了 2 台笔记本
|
|
|
|
|
+ (2, 2, 2, 15, "2024-01-16"), # 李四买了 15 个键盘
|
|
|
|
|
+ (3, 3, 1, 10, "2024-01-17"), # 王五买了 10 台笔记本
|
|
|
|
|
+ (4, 5, 3, 6, "2024-01-18"), # 钱七买了 6 把办公椅
|
|
|
|
|
+ (5, 2, 4, 5, "2024-01-19"), # 李四买了 5 台显示器
|
|
|
|
|
+]
|
|
|
|
|
+
|
|
|
|
|
+# executemany 批量插入,比逐条 insert 高效得多
|
|
|
|
|
+cursor.executemany("INSERT IGNORE INTO employees VALUES (%s,%s,%s,%s,%s)", employees_data)
|
|
|
|
|
+cursor.executemany("INSERT IGNORE INTO products VALUES (%s,%s,%s,%s,%s)", products_data)
|
|
|
|
|
+cursor.executemany("INSERT IGNORE INTO orders VALUES (%s,%s,%s,%s,%s)", orders_data)
|
|
|
|
|
+
|
|
|
|
|
+conn.commit()
|
|
|
|
|
+conn.close()
|
|
|
|
|
+
|
|
|
|
|
+print("✅ 数据库初始化完成")
|
|
|
|
|
+print(" - employees 表:5 条员工记录")
|
|
|
|
|
+print(" - products 表:4 条产品记录")
|
|
|
|
|
+print(" - orders 表:5 条订单记录")
|