| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 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", 3307)),
- user=os.getenv("DB_USER", "root"),
- password=os.getenv("DB_PASSWORD", ""),
- database=os.getenv("DB_NAME", "analytics_demo"),
- )
- 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 条订单记录")
|