专栏导读
专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html
1 ORM 概述
ORM(对象关系映射)是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系,使得数据库中的表和记录可以映射到编程语言中的对象和类。ORM的目标是简化数据库操作,使开发人员能够以面向对象的方式处理数据库。
在Python中,有多个ORM库可用,其中最知名的是SQLAlchemy。SQLAlchemy提供了一种将Python对象与数据库表之间建立映射关系的方式,允许开发人员使用Python类来操作数据库。
ORM的优势包括:
- 抽象化数据库操作:ORM隐藏了底层数据库的细节,开发人员可以更专注于业务逻辑,而不需要编写复杂的SQL查询。
- 面向对象编程:ORM允许开发人员使用面向对象的方式处理数据,使得代码更加清晰、可维护。
- 跨数据库支持:ORM库通常提供了跨多种数据库的支持,开发人员可以轻松切换数据库而不需要更改大量代码。
- 自动建表和迁移:ORM库可以自动根据定义的Python类生成数据库表,并支持数据库迁移。
- 查询生成器:ORM库通常提供了查询生成器,使得编写查询更加简单和直观。
- 事务管理:ORM库可以帮助管理事务,确保数据的一致性和完整性。
2 SQLAlchemy 概述
SQLAlchemy是一个强大的Python SQL工具包和对象关系映射(ORM)库,它允许开发人员使用Python编程语言与关系型数据库进行交互。SQLAlchemy提供了一种灵活且强大的方式来执行SQL查询、插入、更新、删除等操作,同时还支持将数据库表映射到Python类,使开发人员可以以面向对象的方式操作数据库。
以下是SQLAlchemy的主要特点和概述:
- ORM功能:SQLAlchemy的核心特点之一是其ORM功能。它允许你通过定义Python类来映射数据库表和记录,将数据库操作转化为面向对象的操作,使代码更加直观和易于维护。
- 多种数据库支持:SQLAlchemy支持多种关系型数据库,包括MySQL、SQLite、PostgreSQL、Oracle等,允许开发人员在不同数据库之间切换而无需更改大部分代码。
- 灵活性:SQLAlchemy提供了多种方式来执行SQL操作,包括原始SQL查询、查询生成器以及ORM查询。这使得开发人员可以根据需求选择适合的方式。
- 连接池管理:SQLAlchemy支持连接池管理,可以在应用程序和数据库之间维护一组数据库连接,提高性能和效率。
- 事务管理:SQLAlchemy允许你使用事务管理来确保数据库操作的一致性和完整性,可以提交、回滚和中断事务。
- 数据库迁移:SQLAlchemy提供了Alembic工具,用于数据库迁移和版本管理,使得对数据库结构的变更更加可控。
- 多种关联:SQLAlchemy支持多种关联类型,如一对多、多对多等关联关系,使数据库之间的关系更加清晰。
- 跨表查询:SQLAlchemy允许在ORM查询中执行跨表联接,从而实现复杂的查询操作。
- 性能优化:SQLAlchemy提供了各种性能优化选项,如缓存、批量操作等,以提升大规模数据处理的效率。
- 丰富的文档和社区支持:SQLAlchemy拥有丰富的官方文档和活跃的社区,使得学习和解决问题变得更加容易。
总之,SQLAlchemy是一个强大的Python数据库工具包,适用于各种规模的项目,从小型应用到大型企业级系统。它的灵活性、面向对象的设计和多种功能使得它成为Python开发人员进行数据库操作的首选工具之一。
3 ORM:SQLAlchemy使用
当使用Python中的ORM(例如SQLAlchemy)时,你可以通过创建Python类来定义数据库模型,然后使用这些模型对象来执行数据库操作。以下是使用SQLAlchemy的详细示例:
3.1 安装SQLAlchemy:
首先,你需要安装SQLAlchemy库。你可以使用以下命令在终端中安装它:
pip install sqlalchemy
3.2 定义数据库模型类:
创建一个Python类来定义数据库模型。每个类表示一个表,类的属性表示表的列。
from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base # 创建数据库连接 engine = create_engine('sqlite:///example.db') Base = declarative_base() # 定义模型类 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer)
3.3 创建数据表:
通过调用create_all()
方法创建数据库表。
Base.metadata.create_all(engine)
3.4 插入数据:
创建一个模型对象,然后将其添加到会话中并提交。
from sqlalchemy.orm import sessionmaker # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 添加数据 new_user = User(name='Alice', age=25) session.add(new_user) session.commit()
3.5 查询数据:
使用会话查询模型对象。
# 查询数据 user = session.query(User).filter_by(name='Alice').first() if user: print("User found:", user.name, user.age) else: print("User not found")
3.6 更新数据:
可以更新模型对象的属性,然后提交会话来更新数据库。
user.age = 26 session.commit()
3.7 删除数据:
使用delete()
方法删除模型对象,然后提交会话。
session.delete(user) session.commit()
3.8 关闭会话:
记得在完成操作后关闭会话。
session.close()
4 实战
设计一个简单的图书管理系统。
以下是一个使用SQLAlchemy的图书管理系统的完整示例
确保已安装sqlalchemy, pip install sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建数据库连接 engine = create_engine('sqlite:///library.db') Base = declarative_base() # 定义作者模型类 class Author(Base): __tablename__ = 'authors' id = Column(Integer, primary_key=True) name = Column(String) # 定义图书模型类 class Book(Base): __tablename__ = 'books' id = Column(Integer, primary_key=True) title = Column(String) author_id = Column(Integer, ForeignKey('authors.id')) # 创建数据表 Base.metadata.create_all(engine) # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 添加作者 author1 = Author(name='J.K. Rowling') author2 = Author(name='George Orwell') session.add_all([author1, author2]) session.commit() # 添加图书 book1 = Book(title='Harry Potter and the Sorcerer\'s Stone', author_id=author1.id) book2 = Book(title='1984', author_id=author2.id) session.add_all([book1, book2]) session.commit() # 查询数据 print("Authors:") authors = session.query(Author).all() for author in authors: print("Author:", author.name) selected_author = session.query(Author).filter_by(name='J.K. Rowling').first() if selected_author: print("\nBooks by", selected_author.name) books = session.query(Book).filter_by(author_id=selected_author.id).all() for book in books: print("Book:", book.title) # 关闭会话 session.close()
上述代码示例演示了如何使用SQLAlchemy库创建一个简单的图书管理系统。
- 导入所需模块:代码开始时导入了所需的SQLAlchemy模块,包括创建引擎、定义模型类、创建数据表和会话等。
- 创建数据库连接和基类:使用
create_engine
函数创建了SQLite数据库连接,然后通过declarative_base
创建了一个基类Base
。 - 定义模型类:定义了两个模型类,即
Author
(作者)和Book
(图书)。每个类对应一个表,类的属性对应表的列。 - 创建数据表:通过调用
Base.metadata.create_all(engine)
方法,基于模型类创建了数据库中的数据表。 - 创建会话:使用
sessionmaker
创建了一个会话类Session
,然后通过Session()
创建了一个会话实例session
。 - 添加数据:创建了两个作者实例,使用
session.add_all()
将其添加到会话中,并通过session.commit()
提交到数据库。 - 查询数据:使用
session.query()
查询了作者和图书信息,并进行了打印输出。 - 关闭会话:在所有操作完成后,通过
session.close()
关闭了会话,释放资源。
总体而言,这个示例展示了如何使用SQLAlchemy来创建数据库模型、执行数据库操作、查询数据以及关闭会话。通过使用ORM,你可以将数据库操作转化为面向对象的方式,使代码更加清晰、可维护。你可以根据需求进一步扩展这个示例,添加更多功能和复杂性。