import pymysql
classDatabaseManager:
def__init__(self, config):
self.config = config
self.conn = self._create_connection()
self._init_tables()
def_create_connection(self):
"""自动创建数据库并建立连接"""# 先创建数据库
temp_conn = pymysql.connect(**{
k: v for k, v inself.config.items() if k != 'database'
})
with temp_conn.cursor() as cur:
cur.execute(f"CREATE DATABASE IF NOT EXISTS {self.config['database']} DEFAULT CHARSET utf8mb4")
temp_conn.close()
# 连接目标数据库
pymysql.connect(**.config)
():
.conn.cursor() cur:
cur.execute()
cur.execute()
.conn.commit()
():
.conn.cursor() cur:
cur.execute(sql, params)
fetch:
cur.fetchall()
.conn.commit()
return
self
def
_init_tables
self
"""初始化图书表和借阅记录表"""
with
self
as
# 图书表
"""CREATE TABLE IF NOT EXISTS books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
author VARCHAR(100) NOT NULL,
isbn VARCHAR(20) UNIQUE,
stock INT DEFAULT 0,
available INT DEFAULT 0
)"""
# 借阅记录表
"""CREATE TABLE IF NOT EXISTS borrow_records (
id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT NOT NULL,
borrower_name VARCHAR(50) NOT NULL,
FOREIGN KEY (book_id) REFERENCES books(id)
)"""
self
def
execute
self, sql, params=(), fetch=False
"""统一执行 SQL"""
with
self
as
if
return
self
(二)图书业务管理模块(BookManager)
核心功能:图书增删、借阅归还,精简核心代码如下:
from datetime import datetime, timedelta
classBookManager:
def__init__(self, db):
self.db = db
defadd_book(self, title, author, isbn, stock=1):
"""添加图书"""
sql = "INSERT INTO books (title, author, isbn, stock, available) VALUES (%s,%s,%s,%s,%s)"self.db.execute(sql, (title, author, isbn, stock, stock))
defborrow_book(self, book_id, borrower_name):
"""借书:校验库存 + 更新可借数量 + 生成记录"""# 校验可借数量
book = self.db.execute("SELECT available FROM books WHERE id=%s", (book_id,), fetch=True)
ifnot book or book[0][0] <= 0:
returnFalse# 生成借阅记录
borrow_date = datetime.now().date()
return_date = borrow_date + timedelta(days=30)
self.db.execute("INSERT INTO borrow_records (book_id, borrower_name, borrow_date, return_date) VALUES (%s,%s,%s,%s)",
(book_id, borrower_name, borrow_date, return_date))
# 更新可借数量self.db.execute("UPDATE books SET available = available -1 WHERE id=%s", (book_id,))
returnTruedefreturn_book(self, record_id):
"""还书:更新状态 + 恢复可借数量"""# 获取图书 ID
book_id = self.db.execute("SELECT book_id FROM borrow_records WHERE id=%s", (record_id,), fetch=True)[0][0]
# 更新借阅状态self.db.execute("UPDATE borrow_records SET status='已还', actual_return_date=%s WHERE id=%s",
(datetime.now().date(), record_id))
# 恢复可借数量self.db.execute("UPDATE books SET available = available +1 WHERE id=%s", (book_id,))
returnTrue