mirror of
http://47.106.207.27:3000/Jeremy_liu/AI0814_jiaoan_public.git
synced 2026-09-27 06:14:14 +08:00
199 lines
5.6 KiB
Python
199 lines
5.6 KiB
Python
"""
|
||
07 连接数据库版本:学生增删改查
|
||
|
||
数据库连接信息:
|
||
host: localhost
|
||
port: 3306
|
||
user: root
|
||
password: 123456
|
||
database: student_demo
|
||
|
||
依赖安装:
|
||
pip install pymysql
|
||
|
||
本文件会自动创建数据库和 students 表。
|
||
"""
|
||
|
||
import pymysql
|
||
|
||
|
||
DB_CONFIG = {
|
||
"host": "localhost",
|
||
"port": 3306,
|
||
"user": "root",
|
||
"password": "123456",
|
||
"charset": "utf8mb4",
|
||
}
|
||
|
||
DATABASE = "student_demo"
|
||
|
||
|
||
def get_server_connection():
|
||
return pymysql.connect(**DB_CONFIG)
|
||
|
||
|
||
def get_db_connection():
|
||
return pymysql.connect(
|
||
**DB_CONFIG,
|
||
database=DATABASE,
|
||
cursorclass=pymysql.cursors.DictCursor,
|
||
)
|
||
|
||
|
||
def init_database():
|
||
with get_server_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
cursor.execute(
|
||
f"CREATE DATABASE IF NOT EXISTS {DATABASE} "
|
||
"DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
|
||
)
|
||
connection.commit()
|
||
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
cursor.execute(
|
||
"""
|
||
CREATE TABLE IF NOT EXISTS students (
|
||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||
name VARCHAR(50) NOT NULL,
|
||
age INT NOT NULL,
|
||
phone VARCHAR(30) NOT NULL
|
||
)
|
||
"""
|
||
)
|
||
connection.commit()
|
||
|
||
|
||
class StudentRepository:
|
||
def add(self, name, age, phone):
|
||
sql = "INSERT INTO students(name, age, phone) VALUES(%s, %s, %s)"
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
cursor.execute(sql, (name, age, phone))
|
||
connection.commit()
|
||
|
||
def list_all(self):
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
cursor.execute("SELECT id, name, age, phone FROM students ORDER BY id")
|
||
return cursor.fetchall()
|
||
|
||
def search_by_name(self, name):
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
cursor.execute(
|
||
"SELECT id, name, age, phone FROM students WHERE name = %s ORDER BY id",
|
||
(name,),
|
||
)
|
||
return cursor.fetchall()
|
||
|
||
def update(self, student_id, name, age, phone):
|
||
sql = "UPDATE students SET name = %s, age = %s, phone = %s WHERE id = %s"
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
affected_rows = cursor.execute(sql, (name, age, phone, student_id))
|
||
connection.commit()
|
||
return affected_rows
|
||
|
||
def delete(self, student_id):
|
||
with get_db_connection() as connection:
|
||
with connection.cursor() as cursor:
|
||
affected_rows = cursor.execute(
|
||
"DELETE FROM students WHERE id = %s",
|
||
(student_id,),
|
||
)
|
||
connection.commit()
|
||
return affected_rows
|
||
|
||
|
||
class StudentApp:
|
||
def __init__(self):
|
||
self.repository = StudentRepository()
|
||
|
||
def show_menu(self):
|
||
print("\n====== 学生管理系统:PyMySQL 数据库版本 ======")
|
||
print("1. 添加学生")
|
||
print("2. 查看所有学生")
|
||
print("3. 查询学生")
|
||
print("4. 修改学生")
|
||
print("5. 删除学生")
|
||
print("0. 退出")
|
||
|
||
def add_student(self):
|
||
name = input("姓名:").strip()
|
||
age = int(input("年龄:").strip())
|
||
phone = input("电话:").strip()
|
||
self.repository.add(name, age, phone)
|
||
print("添加成功")
|
||
|
||
def list_students(self):
|
||
students = self.repository.list_all()
|
||
if not students:
|
||
print("暂无学生")
|
||
return
|
||
for student in students:
|
||
print(student)
|
||
|
||
def search_student(self):
|
||
name = input("请输入要查询的姓名:").strip()
|
||
students = self.repository.search_by_name(name)
|
||
if not students:
|
||
print("没有找到该学生")
|
||
return
|
||
for student in students:
|
||
print(student)
|
||
|
||
def update_student(self):
|
||
student_id = int(input("请输入要修改的学生 ID:").strip())
|
||
name = input("新姓名:").strip()
|
||
age = int(input("新年龄:").strip())
|
||
phone = input("新电话:").strip()
|
||
affected_rows = self.repository.update(student_id, name, age, phone)
|
||
|
||
if affected_rows:
|
||
print("修改成功")
|
||
else:
|
||
print("没有找到该学生")
|
||
|
||
def delete_student(self):
|
||
student_id = int(input("请输入要删除的学生 ID:").strip())
|
||
affected_rows = self.repository.delete(student_id)
|
||
|
||
if affected_rows:
|
||
print("删除成功")
|
||
else:
|
||
print("没有找到该学生")
|
||
|
||
def run(self):
|
||
menu = {
|
||
"1": self.add_student,
|
||
"2": self.list_students,
|
||
"3": self.search_student,
|
||
"4": self.update_student,
|
||
"5": self.delete_student,
|
||
}
|
||
|
||
while True:
|
||
self.show_menu()
|
||
choice = input("请输入操作编号:").strip()
|
||
|
||
if choice == "0":
|
||
print("程序结束")
|
||
break
|
||
|
||
action = menu.get(choice)
|
||
if action is None:
|
||
print("输入有误,请重新输入")
|
||
continue
|
||
|
||
try:
|
||
action()
|
||
except ValueError:
|
||
print("年龄和 ID 必须输入数字")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
init_database()
|
||
app = StudentApp()
|
||
app.run()
|