分层设计Python数据库操作方案

在实际的软件开发中,数据库操作是一个非常重要的部分。为了提高代码的可维护性和可扩展性,我们可以采用分层设计的方式来进行数据库操作。在这篇文章中,我们将介绍如何使用Python来进行数据库操作,并采用分层设计的方式来解决一个具体的问题。

问题背景

假设我们有一个学生管理系统,需要实现对学生信息的增、删、改、查等操作。我们希望将数据库操作分为三层:数据访问层(Data Access Layer)、业务逻辑层(Business Logic Layer)和表示层(Presentation Layer)。其中,数据访问层负责与数据库进行交互,业务逻辑层负责处理业务逻辑,表示层负责与用户进行交互。

分层设计方案

数据访问层

数据访问层负责与数据库进行连接,并执行具体的数据库操作。我们可以使用ORM框架来简化数据库操作。在这里,我们将使用SQLAlchemy作为ORM框架。下面是数据访问层的代码示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Student(Base):
    __tablename__ = 'students'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

engine = create_engine('sqlite:///students.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

业务逻辑层

业务逻辑层负责处理具体的业务逻辑,例如对学生信息的增、删、改、查操作。在这里,我们将实现一个简单的学生管理类,包括增加学生、删除学生、更新学生信息和查询学生信息等功能。下面是业务逻辑层的代码示例:

from data_access_layer import session, Student

class StudentManager:
    def add_student(self, name, age):
        new_student = Student(name=name, age=age)
        session.add(new_student)
        session.commit()

    def delete_student(self, student_id):
        student = session.query(Student).filter_by(id=student_id).first()
        session.delete(student)
        session.commit()

    def update_student(self, student_id, name, age):
        student = session.query(Student).filter_by(id=student_id).first()
        student.name = name
        student.age = age
        session.commit()

    def get_student(self, student_id):
        student = session.query(Student).filter_by(id=student_id).first()
        return student

表示层

表示层负责与用户进行交互,例如通过命令行、Web界面或API等方式。在这里,我们将使用命令行界面来演示。下面是表示层的代码示例:

from business_logic_layer import StudentManager

student_manager = StudentManager()

while True:
    print("1. Add student")
    print("2. Delete student")
    print("3. Update student")
    print("4. Get student")
    choice = input("Enter your choice: ")

    if choice == '1':
        name = input("Enter student name: ")
        age = int(input("Enter student age: "))
        student_manager.add_student(name, age)
    elif choice == '2':
        student_id = int(input("Enter student id: "))
        student_manager.delete_student(student_id)
    elif choice == '3':
        student_id = int(input("Enter student id: "))
        name = input("Enter new name: ")
        age = int(input("Enter new age: "))
        student_manager.update_student(student_id, name, age)
    elif choice == '4':
        student_id = int(input("Enter student id: "))
        student = student_manager.get_student(student_id)
        if student:
            print(f"Name: {student.name}, Age: {student.age}")
        else:
            print("Student not found")
    else:
        print("Invalid choice")

类图

下面是分层设计的类图:

classDiagram
    class Student {
        id: Integer
        name: String
        age: Integer
    }

    class StudentManager {
        add_student(name: String, age: Integer)
        delete_student(student_id: Integer)
        update_student(student_id: Integer, name: String, age: Integer)
        get_student(student_id: Integer): Student
    }

    Student <-- StudentManager