Python SQLAlchemy库的实现示例

原创
ithorizon 9个月前 (07-01) 阅读数 188 #Python
目录
  • 一、介绍
  • 二、安装和配置SQLAlchemy
    • 1、使用pip安装SQLAlchemy
    • 2、确认安装
    • 3、配置SQLAlchemy连接
  • 三、核心概念
    • 四、基本用法
      • 1、创建数据库模型
      • 2、执行基本的CRUD操作
        • (1)创建(Create)
        • (2)读取(Read)
        • (3)更新(Update)
        • (4)删除(Delete)
    • 五、查询
      • 1、过滤(Filter)
        • 2、排序(Order By)
          • 3、连接(Join)
            • 4、聚合函数(Aggregate Functions)
              • 5、过滤并排序(Filter and Order By)
                • 6、聚合查询(Group By)
                  • 7、子查询(Subquery)
                    • 8、原生 SQL 查询(Raw SQL Query)
                    • 六、相关性关系
                      • 1. 一对一关系(One-to-One Relationship)
                        • 定义模型:
                      • 2. 一对多关系(One-to-Many Relationship)
                        • 定义模型:
                      • 3. 多对多关系(Many-to-Many Relationship)
                        • 定义模型:
                    • 七、事务管理
                      • 1、开启事务
                        • 2、提交事务
                          • 3、回滚事务
                            • 4、自动提交
                              • 5、事务的嵌套
                                • 6、事务的隔离级别
                                • 八、性能优化
                                  • 1、延迟加载(Lazy Loading)
                                    • 2、预加载(Eager Loading)
                                      • 3、缓存(Caching)
                                        • 4、批量操作(Bulk Operations)
                                          • 5、SQL表达式(SQL Expressions)

                                          大家好,在Python生态系统中,SQLAlchemy库是一个强盛的工具,为开发人员提供了便捷的对策来处理与数据库的交互。无论是开发一个小型的Web应用程序,还是构建一个大型的企业级系统,SQLAlchemy都能满足你的需求,并提供灵活性和性能上的优势。本文将带你深入探索SQLAlchemy库,从基础概念到高级用法,让你对其有一个全面的了解。

                                          一、介绍

                                          SQLAlchemy是Python中一个强盛的开源SQL工具包和对象关系映射(ORM)库,它允许开发人员以Python代码的对策与关系型数据库进行交互。无论是易懂的SQLite数据库,还是繁复的MySQL、PostgreSQL、Oracle等企业级数据库,SQLAlchemy都能轻松应对。

                                          在传统的数据库交互中,开发人员通常需要编写大量的SQL语句来执行各种操作,如创建表、插入数据、查询记录等。这种对策也许会造成代码重复、可维护性差和保险性问题。而SQLAlchemy的出现解决了这些问题。

                                          SQLAlchemy提供了一种更加直观和Pythonic的对策来处理数据库交互。它的核心优势之一是将数据库表映射为Python类,允许开发人员可以使用面向对象的对策来操作数据库,而不必直接与SQL语句打交道。这种抽象化的设计让数据库操作变得更加易懂和直观。

                                          此外,SQLAlchemy还提供了强盛的查询语言和灵活的对象关系映射机制,允许开发人员可以轻松地执行繁复的数据库查询和操作。它赞成事务管理、连接池、数据库连接的自动管理等功能,为开发人员提供了一套完整的数据库解决方案。

                                          二、安装和配置SQLAlchemy

                                          安装SQLAlchemy非常易懂,可以通过pip(Python包管理器)来完成。以下是安装SQLAlchemy的步骤:

                                          1、使用pip安装SQLAlchemy

                                          打开命令行界面(如终端或命令提示符),然后运行以下命令:

                                          pip install sqlalchemy
                                          

                                          这将会从Python Package Index(PyPI)下载并安装SQLAlchemy库及其依存项。

                                          2、确认安装

                                          安装完成后,你可以运行以下命令来确认SQLAlchemy已圆满安装:

                                          python -c "import sqlalchemy; print(sqlalchemy.__version__)"
                                          

                                          如果安装圆满,将会打印出SQLAlchemy的版本号。

                                          现在,SQLAlchemy已经圆满安装在你的Python环境中了。接下来,让我们进行易懂的配置。

                                          3、配置SQLAlchemy连接

                                          在使用SQLAlchemy之前,你需要配置连接信息,以便连接到数据库。SQLAlchemy赞成多种数据库,于是你需要依你使用的数据库类型进行相应的配置。以下是一个易懂的示例,演示怎样配置连接到SQLite数据库:

                                          from sqlalchemy import create_engine
                                          
                                          # SQLite数据库连接字符串
                                          DATABASE_URL = "sqlite:///mydatabase.db"
                                          
                                          # 创建数据库引擎
                                          engine = create_engine(DATABASE_URL)
                                          
                                          # 测试连接是否圆满
                                          if engine.connect():
                                              print("Connection successful!")
                                          else:
                                              print("Connection failed!")
                                          

                                          在这个示例中,我们使用了SQLite数据库,并指定了一个SQLite连接字符串作为数据库的路径。你可以依自己的需要修改连接字符串,以连接到其他类型的数据库,如MySQL、PostgreSQL等。

                                          三、核心概念

                                          当谈到SQLAlchemy的核心概念时,通常涉及到一些重要的概念和组件,包括表(Table)、模型(Model)、会话(Session)等。下面是对这些核心概念的详细介绍:

                                          表(Table)

                                          表是数据库中存储数据的结构化对策,它由一系列列组成,每列定义了表中存储的数据的类型。在SQLAlchemy中,表可以通过Table类来即,通常与数据库中的实际表相对应。你可以使用Table类来定义表的结构,包括列的名称、数据类型、约束条件等。

                                          模型(Model)

                                          模型是SQLAlchemy中最重要的概念之一,它将数据库中的表映射为Python类。每个模型类对应着数据库中的一个表,类的属性对应着表中的列。通过模型,你可以使用面向对象的对策来操作数据库,而不必直接编写SQL语句。在SQLAlchemy中,模型通常是通过继承declarative_base类创建的。

                                          会话(Session)

                                          会话是SQLAlchemy中用于管理数据库事务的核心组件之一。通过会话,你可以执行数据库的增、删、改、查等操作,并确保这些操作在一个事务中原子地提交或回滚。会话提供了一种高层次的接口,允许对数据库的操作更加易懂和直观。在SQLAlchemy中,你可以通过sessionmaker来创建会话工厂,然后使用这个工厂创建会话对象。

                                          以上是SQLAlchemy中的一些核心概念,它们构成了SQLAlchemy强盛而灵活的ORM框架的基础。懂得这些概念将有助于你更好地使用SQLAlchemy进行数据库操作,尽也许减少损耗代码的可维护性和可读性。在后续的文章中,我们将会更深入地探讨这些概念,并演示怎样在实际项目中应用它们。

                                          四、基本用法

                                          下面是SQLAlchemy中基本用法的详细介绍,包括怎样创建数据库模型以及执行基本的CRUD操作(创建、读取、更新、删除):

                                          1、创建数据库模型

                                          首先,我们需要定义数据库模型,通常是通过创建一个继承自Base的Python类来实现的。这个类对应着数据库中的一张表,类的属性对应着表中的列。例如,我们创建一个易懂的User模型来即用户表:

                                          from sqlalchemy import Column, Integer, String
                                          from sqlalchemy.ext.declarative import declarative_base
                                          
                                          Base = declarative_base()
                                          
                                          class User(Base):
                                              __tablename__ = 'users'
                                          
                                              id = Column(Integer, primary_key=True)
                                              username = Column(String)
                                              email = Column(String)
                                          

                                          2、执行基本的CRUD操作

                                          一旦定义了数据库模型,我们就可以使用SQLAlchemy来执行各种数据库操作,包括创建、读取、更新、删除等。

                                          (1)创建(Create)

                                          要创建新的数据库记录,我们可以使用模型类的构造函数来创建对象,然后将其添加到会话中,并提交事务以保存到数据库:

                                          from sqlalchemy import create_engine
                                          from sqlalchemy.orm import sessionmaker
                                          
                                          # 创建数据库引擎
                                          engine = create_engine('sqlite:///mydatabase.db')
                                          
                                          # 创建会话工厂
                                          Session = sessionmaker(bind=engine)
                                          session = Session()
                                          
                                          # 创建新用户
                                          new_user = User(username='John', email='john@example.com')
                                          session.add(new_user)
                                          session.commit()
                                          

                                          (2)读取(Read)

                                          要从数据库中读取记录,我们可以使用查询语句来执行查询操作,并使用all()方法获取所有最终或first()方法获取第一个最终:

                                          # 查询所有用户
                                          all_users = session.query(User).all()
                                          
                                          # 查询第一个用户
                                          first_user = session.query(User).first()
                                          

                                          (3)更新(Update)

                                          要更新数据库记录,我们可以获取要更新的对象,然后修改其属性,并提交事务以保存更改到数据库:

                                          # 查询并更新用户
                                          user = session.query(User).filter_by(username='John').first()
                                          user.email = 'john_new@example.com'
                                          session.commit()
                                          

                                          (4)删除(Delete)

                                          要删除数据库记录,我们可以使用delete()方法来删除对象,并提交事务以保存更改到数据库:

                                          # 查询并删除用户
                                          user = session.query(User).filter_by(username='John').first()
                                          session.delete(user)
                                          session.commit()
                                          

                                          通过以上步骤,我们可以使用SQLAlchemy执行基本的CRUD操作,从而实现对数据库的增、删、改、查等功能。这些操作可以帮助我们轻松地管理数据库中的数据,尽也许减少损耗开发效能和代码质量。

                                          五、查询

                                          在SQLAlchemy中,查询是使用query()方法执行的。通过查询对象,您可以执行各种数据库操作,包括过滤、排序、连接等。

                                          1、过滤(Filter)

                                          过滤操作用于依特定条件检索数据。

                                          from sqlalchemy import create_engine
                                          from sqlalchemy.orm import sessionmaker
                                          from models import Employee  # 假设Employee模型已经定义
                                          
                                          # 创建数据库引擎和会话
                                          engine = create_engine('sqlite:///example.db')
                                          Session = sessionmaker(bind=engine)
                                          session = Session()
                                          
                                          # 查询所有名字为"John"的员工
                                          john_employees = session.query(Employee).filter(Employee.name == 'John').all()
                                          

                                          2、排序(Order By)

                                          排序操作用于按特定列的顺序检索数据。

                                          # 查询所有员工按照名字的字母顺序排序
                                          sorted_employees = session.query(Employee).order_by(Employee.name).all()
                                          

                                          3、连接(Join)

                                          连接操作用于联合两个或多个表以获取相相关性的数据。

                                          from models import Department  # 假设Department模型已经定义
                                          
                                          # 查询所有员工及其所属部门的名称
                                          employees_with_departments = session.query(Employee, Department).join(Employee.department).all()
                                          

                                          4、聚合函数(Aggregate Functions)

                                          聚合函数用于执行统计操作,如计数、求和、平均值等。

                                          from sqlalchemy import func
                                          
                                          # 查询员工数量
                                          employee_count = session.query(func.count(Employee.id)).scalar()
                                          

                                          5、过滤并排序(Filter and Order By)

                                          您可以结合使用过滤和排序来执行更精细的数据检索。

                                          # 查询名字为"John"的员工并按照ID降序排列
                                          john_employees_sorted = session.query(Employee).filter(Employee.name == 'John').order_by(Employee.id.desc()).all()
                                          

                                          6、聚合查询(Group By)

                                          聚合查询用于对数据进行分组并应用聚合函数。

                                          # 查询每个部门的员工数量
                                          from sqlalchemy import func
                                          
                                          employee_count_by_department = session.query(Employee.department_id, func.count(Employee.id)).group_by(Employee.department_id).all()
                                          

                                          7、子查询(Subquery)

                                          子查询是在主查询中使用的嵌套查询。

                                          # 查询工资高于平均工资的员工
                                          from sqlalchemy.sql import select
                                          
                                          avg_salary = session.query(func.avg(Employee.salary)).scalar()
                                          subquery = select([Employee]).where(Employee.salary > avg_salary).alias()
                                          employees_above_avg_salary = session.query(subquery).all()
                                          

                                          8、原生 SQL 查询(Raw SQL Query)

                                          有时您也许需要执行原生的 SQL 查询,SQLAlchemy也赞成这种对策。

                                          # 执行原生 SQL 查询
                                          result = session.execute("SELECT * FROM employees WHERE salary > :salary", {"salary": 50000})
                                          for row in result:
                                              print(row)
                                          

                                          六、相关性关系

                                          相关性关系在数据库中非常常见,用于即不同表之间的相关性和连接。在SQLAlchemy中,您可以使用外键和关系来定义和管理这些相关性关系。我将详细介绍怎样定义和使用数据库表之间的不同相关性关系,包括一对一、一对多和多对多关系。

                                          1. 一对一关系(One-to-One Relationship)

                                          一对一关系即两个表之间的一一对应关系。例如,一个人只能有一个身份证号,而一个身份证号也只能对应一个人。

                                          定义模型:

                                          from sqlalchemy import Column, Integer, String, ForeignKey
                                          from sqlalchemy.orm import relationship
                                          from sqlalchemy.ext.declarative import declarative_base
                                          
                                          Base = declarative_base()
                                          
                                          class Person(Base):
                                              __tablename__ = 'persons'
                                          
                                              id = Column(Integer, primary_key=True)
                                              name = Column(String)
                                              identity_card_id = Column(Integer, ForeignKey('identity_cards.id'))
                                          
                                              identity_card = relationship("IdentityCard", uselist=False)
                                          
                                          class IdentityCard(Base):
                                              __tablename__ = 'identity_cards'
                                          
                                              id = Column(Integer, primary_key=True)
                                              number = Column(String, unique=True)
                                          

                                          使用:

                                          # 创建一个人和一个身份证号
                                          person = Person(name='John')
                                          identity_card = IdentityCard(number='1234567890')
                                          
                                          # 相关性两者
                                          person.identity_card = identity_card
                                          

                                          2. 一对多关系(One-to-Many Relationship)

                                          一对多关系即一个对象可以有多个相相关性的对象。例如,一个部门可以有多个员工,但一个员工只能属于一个部门。

                                          定义模型:

                                          class Department(Base):
                                              __tablename__ = 'departments'
                                          
                                              id = Column(Integer, primary_key=True)
                                              name = Column(String)
                                              employees = relationship("Employee", back_populates="department")
                                          
                                          class Employee(Base):
                                              __tablename__ = 'employees'
                                          
                                              id = Column(Integer, primary_key=True)
                                              name = Column(String)
                                              department_id = Column(Integer, ForeignKey('departments.id'))
                                          
                                              department = relationship("Department", back_populates="employees")
                                          

                                          使用:

                                          # 创建一个部门和两个员工
                                          department = Department(name='IT')
                                          employee1 = Employee(name='John')
                                          employee2 = Employee(name='Alice')
                                          
                                          # 相关性员工到部门
                                          department.employees.append(employee1)
                                          department.employees.append(employee2)
                                          

                                          3. 多对多关系(Many-to-Many Relationship)

                                          多对多关系即两个对象之间存在繁复的多对多关系。例如,学生和课程之间的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。

                                          定义模型:

                                          association_table = Table('association', Base.metadata,
                                              Column('student_id', Integer, ForeignKey('students.id')),
                                              Column('course_id', Integer, ForeignKey('courses.id'))
                                          )
                                          
                                          class Student(Base):
                                              __tablename__ = 'students'
                                          
                                              id = Column(Integer, primary_key=True)
                                              name = Column(String)
                                              courses = relationship("Course", secondary=association_table, back_populates="students")
                                          
                                          class Course(Base):
                                              __tablename__ = 'courses'
                                          
                                              id = Column(Integer, primary_key=True)
                                              name = Column(String)
                                              students = relationship("Student", secondary=association_table, back_populates="courses")
                                          

                                          使用:

                                          # 创建两个学生和两门课程
                                          student1 = Student(name='John')
                                          student2 = Student(name='Alice')
                                          course1 = Course(name='Math')
                                          course2 = Course(name='Science')
                                          
                                          # 相关性学生和课程
                                          student1.courses.append(course1)
                                          student1.courses.append(course2)
                                          student2.courses.append(course2)
                                          

                                          以上是在SQLAlchemy中定义和使用一对一、一对多和多对多关系的示例。您可以依实际需求,在模型中定义适当的相关性关系,以便更好地管理和操作您的数据。

                                          七、事务管理

                                          事务管理是数据库操作中非常重要的一部分,它确保了数据库操作的一致性和完整性。在SQLAlchemy中,您可以使用会话(Session)对象来管理事务。我将详细介绍怎样使用SQLAlchemy来管理事务。

                                          1、开启事务

                                          在SQLAlchemy中,当您创建一个会话(Session)对象时,事务会自动开启。您可以使用session.begin()方法手动开启事务。

                                          from sqlalchemy.orm import sessionmaker
                                          
                                          # 创建会话
                                          Session = sessionmaker(bind=engine)
                                          session = Session()
                                          
                                          # 手动开启事务
                                          session.begin()
                                          

                                          2、提交事务

                                          一旦您对数据库进行了一系列的操作,并且期待将这些操作永久保存到数据库中,您可以使用session.commit()方法提交事务。

                                          # 提交事务
                                          session.commit()
                                          

                                          3、回滚事务

                                          如果在事务进行过程中出现了不正确,或者您想要取消之前的操作,您可以使用session.rollback()方法回滚事务。

                                          try:
                                              # 一系列数据库操作
                                              session.commit()
                                          except Exception as e:
                                              # 回滚事务
                                              session.rollback()
                                          

                                          4、自动提交

                                          在某些情况下,您也许期待在每次数据库操作后自动提交事务,而不是手动调用commit()方法。您可以通过设置会话的autocommit参数来实现这一点。

                                          # 创建自动提交的会话
                                          Session = sessionmaker(bind=engine, autocommit=True)
                                          session = Session()
                                          

                                          5、事务的嵌套

                                          在SQLAlchemy中,事务是可以嵌套的。如果您在一个事务中开启了另一个事务,那么内部事务的提交和回滚不会影响外部事务。外部事务的提交或回滚会同时提交或回滚内部事务。

                                          # 开启外部事务
                                          session.begin()
                                          
                                          try:
                                              # 一系列数据库操作
                                              session.begin_nested()
                                          
                                              try:
                                                  # 更多数据库操作
                                                  session.commit()  # 提交内部事务
                                              except Exception as e:
                                                  session.rollback()  # 回滚内部事务
                                                  raise
                                          
                                              session.commit()  # 提交外部事务
                                          except Exception as e:
                                              session.rollback()  # 回滚外部事务
                                              raise
                                          

                                          6、事务的隔离级别

                                          SQLAlchemy还提供了事务的隔离级别设置。默认情况下,事务的隔离级别为“可重复读”(REPEATABLE READ)。您可以通过设置会话的isolation_level参数来更改隔离级别。

                                          from sqlalchemy import create_engine
                                          
                                          # 创建引擎并设置事务隔离级别
                                          engine = create_engine('sqlite:///example.db', isolation_level='READ COMMITTED')
                                          

                                          通过这些方法,您可以使用SQLAlchemy管理事务,确保数据库操作的一致性和完整性。无论您是手动控制事务还是使用自动提交,SQLAlchemy都提供了灵活的对策来满足您的需求。

                                          八、性能优化

                                          在SQLAlchemy中,性能优化是一个重要的方面,它可以显著尽也许减少损耗数据库操作的效能。以下是一些SQLAlchemy中的性能优化技巧:

                                          1、延迟加载(Lazy Loading)

                                          延迟加载是一种优化技术,它允许您在需要时才从数据库中加载数据,而不是在对象被访问时立即加载。这可以减少不必要的数据库查询,尽也许减少损耗性能。

                                          在SQLAlchemy中,默认情况下,相关性对象是延迟加载的,这意味着当您访问相关性对象时,才会从数据库中加载相关数据。例如:

                                          # 延迟加载示例
                                          employee = session.query(Employee).first()
                                          print(employee.department.name)  # 在访问时加载部门对象
                                          

                                          2、预加载(Eager Loading)

                                          预加载是指在执行查询时,一次性加载所有相相关性的对象,而不是在需要时逐个加载。这样可以减少多次查询,尽也许减少损耗性能。

                                          在SQLAlchemy中,您可以使用options()方法来指定预加载选项。例如,使用joinedload()来预加载相关性对象:

                                          from sqlalchemy.orm import joinedload
                                          
                                          # 预加载示例
                                          employee = session.query(Employee).options(joinedload(Employee.department)).first()
                                          print(employee.department.name)  # 已经预加载了部门对象
                                          

                                          3、缓存(Caching)

                                          缓存是指将数据库查询的最终保存在内存中,以便将来的查询可以直接从缓存中获取,而不必再次查询数据库。这可以显著尽也许减少损耗查询性能,特别是对于频繁重复的查询。

                                          在SQLAlchemy中,您可以使用query_cache参数来启用查询缓存:

                                          from sqlalchemy.orm import Query
                                          
                                          # 启用查询缓存
                                          query = session.query(Employee).options(Query.cacheable(True))
                                          

                                          4、批量操作(Bulk Operations)

                                          批量操作是指一次性执行多个数据库操作,而不是逐个执行单个操作。这可以减少数据库交互的次数,尽也许减少损耗性能。

                                          在SQLAlchemy中,您可以使用bulk_save_objects()方法一次性保存多个对象:

                                          # 批量插入示例
                                          employees = [Employee(name='John'), Employee(name='Alice')]
                                          session.bulk_save_objects(employees)
                                          session.commit()
                                          

                                          5、SQL表达式(SQL Expressions)

                                          有时,您也许需要执行繁复的数据库操作,而ORM也许无法提供足够的性能。在这种情况下,您可以使用SQL表达式直接执行原生SQL查询。

                                          from sqlalchemy.sql import text
                                          
                                          # 原生SQL查询示例
                                          result = session.execute(text("SELECT * FROM employees WHERE salary > :salary"), {"salary": 50000})
                                          for row in result:
                                              print(row)
                                          

                                          以上是一些在SQLAlchemy中用于性能优化的常用技巧。依您的具体需求和场景,选择适合的优化方法可以显著尽也许减少损耗数据库操作的效能。更多相关Python SQLAlchemy库内容请搜索IT视界以前的文章或继续浏览下面的相关文章期待大家以后多多赞成IT视界!


                                          本文由IT视界版权所有,禁止未经同意的情况下转发

                                          文章标签: Python


                                          热门