员工信息查询系统:完整代码与说明文档

一、项目全景图

plaintext

employee-query-system/
├── config.py # 数据库配置中心
├── db_connection.py # 数据库连接管理
├── query.py # 核心查询逻辑
├── result_display.py # 结果展示模块
├── main.py # 程序入口(参数解析)
├── requirements.txt # 依赖清单
└── README.md # 项目说明文档(本部分包含完整内容)

二、完整代码解析

1. 数据库配置:config.py

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025.07.25
# @Author : 王沁桐(3636617336@qq.com)
# @File : config.py
# @Description : 数据库连接参数配置
db_config = {
"host": "localhost", # 数据库地址(默认localhost)
"port": 3306, # 端口(默认3306)
"user": "root", # 数据库用户名
"password": "123456", # 数据库密码(需替换为实际密码)
"database": "employees", # 目标数据库名
"autocommit": True # 自动提交模式(简化开发)
}

2. 数据库连接:db_connection.py

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025.07.25
# @Author : 王沁桐(3636617336@qq.com)
# @File : db_connection.py
# @Description : 数据库连接创建与错误处理
from pymysql import Connection, OperationalError
from config import db_config

def create_db_connection():
"""
创建数据库连接
:return: 数据库连接对象(失败返回None)
"""
try:
# 解包配置字典创建连接
conn = Connection(**db_config)
return conn
except OperationalError as e:
print(f"数据库连接错误: {e}")
return None

3. 主程序入口:main.py

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025.07.25
# @Author : 王沁桐(3636617336@qq.com)
# @File : main.py
# @Description : 解析命令行参数,协调查询流程
import sys
from db_connection import create_db_connection
from query import (query_by_name, query_by_department, query_by_min_salary)
from result_display import display_results

def main():
"""主函数:解析参数并执行对应查询"""
if len(sys.argv) < 3:
# 显示帮助信息
print(" 按名字查询: python main.py name <first_name> (例如: python main.py name Gor)")
print(" 按部门查询: python main.py dept '<dept_name>' (例如: python main.py dept 'Sales')")
print(" 按最低工资查询: python main.py salary <min_salary> (例如: python main.py salary 100000)")
return

query_type = sys.argv[1]
query_value = sys.argv[2]

conn = create_db_connection()

try:
if query_type == "name":
result = query_by_name(conn, query_value)
elif query_type == "dept":
result = query_by_department(conn, query_value)
elif query_type == "salary":
try:
min_salary = int(query_value)
result = query_by_min_salary(conn, min_salary)
except ValueError:
print("错误:工资必须是数字")
return
display_results(result)
finally:
if conn:
conn.close()
print("数据库连接已关闭。")
if __name__ == "__main__":
main()

4. 查询逻辑:query.py

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025.07.25
# @Author : 王沁桐(3636617336@qq.com)
# @File : query.py
# @Description : 定义查询SQL与执行逻辑
from pymysql import ProgrammingError

def _execute_sql(conn, sql, params):
"""内部函数:执行SQL查询并返回结果"""
cursor = conn.cursor()
try:
cursor.execute(sql, params)
return cursor.fetchall()
except ProgrammingError as e:
print(f"SQL执行错误: {e}")
return None
finally:
if cursor:
cursor.close()

def query_by_name(conn, first_name):
"""按姓名查询在职员工信息"""
sql = """
SELECT e.emp_no,
e.first_name,
e.last_name,
de.dept_no,
d.dept_name,
t.title,
s.salary
FROM employees e
JOIN dept_emp de ON e.emp_no = de.emp_no
JOIN titles t ON e.emp_no = t.emp_no
JOIN salaries s ON e.emp_no = s.emp_no
JOIN departments d ON d.dept_no = de.dept_no
WHERE e.first_name = %s
AND s.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
AND de.to_date = '9999-01-01'
"""
return _execute_sql(conn, sql, (first_name,))

def query_by_department(conn, dept_name):
"""按部门名称查询在职员工信息"""
sql = """
SELECT e.emp_no,
e.first_name,
e.last_name,
d.dept_name,
t.title,
s.salary
FROM employees e
JOIN dept_emp de ON e.emp_no = de.emp_no
JOIN departments d ON de.dept_no = d.dept_no
JOIN salaries s ON e.emp_no = s.emp_no
JOIN titles t ON e.emp_no = t.emp_no
WHERE d.dept_name = %s
AND de.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'
"""
return _execute_sql(conn, sql, (dept_name,))

def query_by_min_salary(conn, min_salary):
"""按最低工资查询在职员工信息"""
sql = """
SELECT e.emp_no,
e.first_name,
e.last_name,
d.dept_name,
t.title,
s.salary
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no
JOIN dept_emp de ON e.emp_no = de.emp_no
JOIN departments d ON de.dept_no = d.dept_no
JOIN titles t ON e.emp_no = t.emp_no
WHERE s.salary >= %s
AND de.to_date = '9999-01-01'
AND t.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'
"""
return _execute_sql(conn, sql, (min_salary,))

5. 结果展示:result_display.py

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025.07.25
# @Author : 王沁桐(3636617336@qq.com)
# @File : result_display.py
# @Description : 格式化展示查询结果
def display_results(results):
"""显示查询结果,无匹配时提示"""
if results:
print("查询结果:")
for row in results:
print(row)
else:
print("没有找到匹配的记录。")

6. 依赖清单:requirements.txt

txt

# 数据库连接依赖
pymysql==1.1.0

7. 项目说明文档:README.md

员工信息查询系统

A Python-based tool to query employee information from a MySQL database, supporting multi-condition filtering (by name, department, or minimum salary).

项目简介

该系统用于从 employees MySQL 数据库中查询员工信息,支持三种查询模式:按姓名、按部门名称、按最低工资,返回员工编号、姓名、部门、职位、薪资等关键信息。

核心功能

  • 连接 MySQL 数据库并验证连接有效性
  • 支持三种查询模式:
    • 按员工姓名查询(精确匹配)
    • 按部门名称查询(支持含空格的部门名,如 "Senior Management"
    • 按最低工资查询(返回薪资不低于指定值的员工)
  • 格式化展示查询结果,无匹配时提示明确信息
  • 自动处理数据库连接的创建与关闭,确保资源释放

环境要求

  • Python 版本:3.5 及以上
  • 数据库:MySQL 5.7 及以上(需预先创建 employees 数据库及关联表,表结构需包含 employeesdept_emptitlessalariesdepartments
  • 依赖库pymysql(版本 1.1.0,见 requirements.txt

安装步骤

1. 获取项目代码

bash

# 克隆仓库
git clone https://github.com/haodehaode378/querySQL
cd querySQL # 进入项目目录

2. 安装依赖

bash

pip install -r requirements.txt

数据库配置

  1. 确保 MySQL 服务已启动,且 employees 数据库存在。

  2. 修改

    config.py

    配置文件,适配你的数据库环境:

    python

    # config.py
    db_config = {
    "host": "localhost", # 数据库地址(默认 localhost)
    "port": 3306, # 端口(默认 3306)
    "user": "root", # 数据库用户名
    "password": "123456", # 替换为你的数据库密码
    "database": "employees", # 数据库名(固定为 employees)
    "autocommit": True
    }

使用指南

基本语法

在终端中执行以下命令,根据查询类型传递参数:

bash

python main.py <查询类型> <查询值>

三种查询模式示例

1. 按姓名查询

bash

# 查询名为 "Gor" 的员工
python main.py name Gor

2. 按部门查询

  • 若部门名称含空格(如

    Customer Service

    ),需用引号包裹:

    bash

    # 查询部门为 "Customer Service" 的员工
    python main.py dept "Customer Service"
  • 部门名称无空格时直接传递:

    bash

    # 查询部门为 "Sales" 的员工
    python main.py dept Sales

3. 按最低工资查询

bash

# 查询薪资不低于 100000 的员工
python main.py salary 100000

输出说明

  • 若存在匹配结果,将显示:

    plaintext

    查询结果:
    (10001, 'Gor', 'Smith', 'd001', 'Marketing', 'Senior Engineer', 120000)
    (10005, 'Gor', 'Williams', 'd003', 'Human Resources', 'Staff', 110000)
  • 若无匹配记录,将提示:

    plaintext

    没有找到匹配的记录。

项目结构

plaintext

querySQL/
├── config.py # 数据库配置(主机、端口、账号密码等)
├── db_connection.py # 数据库连接工具(创建连接、错误处理)
├── query.py # 核心查询逻辑(三种查询的SQL语句与执行)
├── result_display.py # 结果展示模块(格式化输出查询结果)
├── main.py # 主程序入口(解析参数、调用模块、协调流程)
├── requirements.txt # 依赖清单(pymysql==1.1.0)
└── README.md # 项目说明文档(本文件)

注意事项

  1. 参数传递

    • 部门名称含空格时,必须用双引号 " 或单引号 ' 包裹(如 python main.py dept "Research and Development"),否则会被识别为多个参数。
    • 薪资参数必须是整数(如 100000),输入非数字会提示错误。
  2. 查询条件

    • 所有查询默认只返回 在职员工to_date='9999-01-01'),如需调整,可修改 query.py 中的 SQL 语句。
    • 姓名和部门名称匹配对大小写敏感(与数据库存储一致)。
  3. 数据依赖

    • 确保 employees 数据库中已创建关联表(employeesdept_emptitlessalariesdepartments),且表结构包含必要字段(如 emp_nodept_namesalary 等)。

许可证

MIT
允许自由使用、修改和分发,需保留原作者信息。

联系方式

  • 作者:王沁桐
  • 邮箱:3636617336@qq.com

三、项目总结与分析

1. 设计亮点

  • 模块化结构:将配置(config.py)、连接(db_connection.py)、查询(query.py)、展示(result_display.py)分离,符合 “单一职责原则”,便于维护和扩展。
  • 安全防护:所有 SQL 查询使用参数化查询(%s占位符),避免 SQL 注入风险;自动关闭数据库连接(finally块),防止资源泄漏。
  • 用户友好:提供清晰的命令行帮助信息,对无效参数(如非数字薪资)进行校验并提示错误,降低使用门槛。

2. 可优化方向

  • 配置安全:当前config.py中密码明文存储,建议通过环境变量(os.getenv("DB_PASSWORD"))或配置文件加密提升安全性。
  • 查询性能:添加查询缓存(如redis)减少重复查询对数据库的压力;对 SQL 语句添加索引优化(如employees(first_name)salaries(salary))。
  • 功能扩展:支持模糊查询(如按姓名前缀匹配)、多条件组合查询(如 “部门 + 最低工资”),提升灵活性。

3. 适用场景

该系统适用于中小型企业的员工信息快速查询,或作为大型 HR 系统的轻量查询模块嵌入使用。通过简单修改query.py中的 SQL 语句,可适配不同的数据库表结构和查询需求。