【成人版python基础入门】第八章 SQLAlchemy——与数据库的“心灵交流”
SQLAlchemy——与数据库的“心灵交流”
在 Python 生态系统中,有许多优秀的库可以帮助开发者与数据库进行交互,而 SQLAlchemy 无疑是最闪耀的明星之一。它不仅仅是一个简单的数据库连接库,更像是一个桥梁,让 Python 代码和数据库之间实现了“心灵交流”。本文将带你深入了解 SQLAlchemy 的特点和优势,学习如何安装和使用 SQLAlchemy,通过一个实际的代码示例展示如何创建一个待办事项应用,帮助你在数据库开发中更加得心应手。
SQLAlchemy 简介
特点
- ORM(对象关系映射):SQLAlchemy 最显著的特点是其强大的 ORM 功能,使得开发者可以通过 Python 对象来操作数据库,而无需直接编写复杂的 SQL 语句。
- 灵活性:SQLAlchemy 支持多种数据库,包括 SQLite、MySQL、PostgreSQL 等,为你提供了非常大的灵活性。
- 事务管理:它内置了事务管理功能,确保数据库操作的一致性和完整性。
- 查询语言:SQLAlchemy 提供了丰富的查询语言,使得查询操作更加简洁和直观。
- 性能优化:虽然 SQLAlchemy 提供了高级的功能,但它在性能优化方面也做得非常出色,能够生成高效的 SQL 语句。
优势
- 减少重复代码:通过 ORM,开发者可以减少大量的重复 SQL 代码。
- 增强代码可读性:SQLAlchemy 的模型和查询语句更加直观和易读。
- 跨数据库支持:同一个代码可以在不同的数据库之间切换,无需重写逻辑。
- 强大的社区支持:SQLAlchemy 拥有庞大的社区,可以轻松获取帮助和资源。
风趣的例子
想象一下,你是一名魔法师,拥有一本魔法书(数据库),但这本书是用一种古老的语言(SQL)写的,你很难理解。这时,一位智慧的长老给了你一个魔法指南(SQLAlchemy),这本指南能够将古老的魔法书翻译成你熟悉的语言,使得你能够更加轻松地施展魔法。SQLAlchemy 就是这本魔法指南,它让你能够用 Python 对象来操作数据库,而无需直接接触复杂的 SQL 语句。
安装 SQLAlchemy
安装步骤
-
打开魔法洞穴(命令行):
- Windows:点击
Win + R
,输入cmd
或PowerShell
,按回车键。 - macOS 和 Linux:打开
Terminal
。
- Windows:点击
-
安装 SQLAlchemy:
在现代的魔法世界中,我们使用
pip
来安装 SQLAlchemy。就像一位魔法师从魔法商店购买魔法道具一样简单。pip install sqlalchemy
-
安装 SQLite 数据库驱动:
虽然 SQLite 通常是预装的,但为了确保一切顺利,我们还是安装一下 SQLite 数据库驱动。
pip install sqlite
交互式连接和操作
现在,我们已经准备好了一切魔法工具,让我们来展示如何使用 SQLAlchemy 连接和操作 SQLite 数据库。
# main.py
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
# 创建引擎
engine = create_engine('sqlite:///example.db', echo=True)
# 创建基类
Base = declarative_base()
# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()
create_engine
:创建一个数据库引擎。echo=True
参数使 SQLAlchemy 在执行 SQL 语句时打印出来,方便调试。declarative_base
:创建一个基类,所有数据库模型都继承自这个基类。sessionmaker
:创建一个会话工厂,用于管理数据库会话。Session
:创建一个会话对象,用于执行数据库操作。
定义模型
在 SQLAlchemy 中,定义模型是一件非常简单的事情。我们只需要创建一个继承自 Base
的类,并使用 Column
来定义表的列。
示例:定义一个书籍模型
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
author = Column(String, nullable=False)
publication_year = Column(Integer)
def __repr__(self):
return f"<Book(title='{self.title}', author='{self.author}', publication_year={self.publication_year})>"
# 创建表
Base.metadata.create_all(engine)
__tablename__
:指定表的名称。Column
:定义表的列。Integer
表示整数类型,String
表示文本类型,primary_key=True
表示该列是主键,nullable=False
表示该列不允许为空。Base.metadata.create_all(engine)
:根据定义的模型创建表。
链接模型
如果你有多个表需要链接,可以使用 ForeignKey
和 relationship
。例如,我们可以定义一个作者模型,并将其与书籍模型链接。
class Author(Base):
__tablename__ = 'authors'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
books = relationship('Book', back_populates='author')
def __repr__(self):
return f"<Author(name='{self.name}')>"
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
publication_year = Column(Integer)
author_id = Column(Integer, ForeignKey('authors.id'))
author = relationship('Author', back_populates='books')
def __repr__(self):
return f"<Book(title='{self.title}', publication_year={self.publication_year}, author='{self.author.name}')>"
# 创建表
Base.metadata.create_all(engine)
ForeignKey('authors.id')
:指定author_id
列为外键,引用authors
表的id
列。relationship('Author', back_populates='books')
:定义Book
和Author
之间的关系,并指定反向关系。
CRUD 操作
增加(Create)
在 SQLAlchemy 中,插入数据非常简单。你只需要创建一个模型对象,并使用 session.add
方法将其添加到会话中,最后调用 session.commit
提交事务。
# 创建一个作者
author = Author(name='Guido van Rossum')
session.add(author)
session.commit()
# 创建一本书
book = Book(title='Python 编程', publication_year=1991, author=author)
session.add(book)
session.commit()
查询(Read)
查询数据也非常直观。你可以使用 session.query
方法来查询数据,并使用 filter
、filter_by
等方法来过滤结果。
# 查询所有书籍
books = session.query(Book).all()
print('所有书籍:')
for book in books:
print(book)
# 查询特定作者的书籍
author_books = session.query(Book).filter_by(author=author).all()
print('特定作者的书籍:')
for book in author_books:
print(book)
# 使用 filter 进行复杂查询
books_2000_plus = session.query(Book).filter(Book.publication_year > 1999).all()
print('2000 年以后出版的书籍:')
for book in books_2000_plus:
print(book)
更新(Update)
更新数据也非常简单。你只需要查询到要更新的对象,修改其属性,然后提交事务。
# 更新书籍信息
book.title = 'Python 编程指南'
session.commit()
print('更新后的书籍:')
print(book)
删除(Delete)
删除数据同样简单。你只需要查询到要删除的对象,使用 session.delete
方法将其删除,然后提交事务。
# 删除书籍
session.delete(book)
session.commit()
print('删除后的书籍:')
books = session.query(Book).all()
for book in books:
print(book)
风趣的例子
想象一下,你是一个图书管理员,使用 SQLAlchemy 管理图书馆的书籍。你可以轻松地添加新书、查询书籍信息、更新书籍信息,甚至删除不再需要的书籍。所有的操作都像在 Python 代码中管理对象一样简单,不再需要复杂的 SQL 语句。SQLAlchemy 就像是你的魔法助手,让你能够更加高效地管理图书馆。
代码样例:利用 SQLAlchemy 创建一个待办事项应用
项目结构
一个简单的待办事项项目结构如下:
todo_app/
main.py
todo.db
创建项目
-
创建项目目录:
mkdir todo_app cd todo_app
-
创建数据库文件:
touch todo.db
编写代码
编辑 main.py
文件,编写以下代码:
# main.py
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 创建引擎
engine = create_engine('sqlite:///todo.db', echo=True)
# 创建基类
Base = declarative_base()
# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()
# 定义待办事项模型
class TodoItem(Base):
__tablename__ = 'todo_items'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
completed = Column(Boolean, default=False)
def __repr__(self):
status = '已完成' if self.completed else '未完成'
return f"<TodoItem(title='{self.title}', status={status})>"
# 创建表
Base.metadata.create_all(engine)
def add_todo_item(title):
""" 添加待办事项 """
item = TodoItem(title=title)
session.add(item)
session.commit()
print(f'待办事项 {title} 添加成功')
def get_all_todo_items():
""" 查询所有待办事项 """
items = session.query(TodoItem).all()
return items
def get_todo_item_by_id(item_id):
""" 根据 ID 查询待办事项 """
item = session.query(TodoItem).get(item_id)
return item
def update_todo_item(item_id, title=None, completed=None):
""" 更新待办事项 """
item = get_todo_item_by_id(item_id)
if item:
if title:
item.title = title
if completed is not None:
item.completed = completed
session.commit()
print(f'待办事项 {item_id} 更新成功')
else:
print(f'没有找到 ID 为 {item_id} 的待办事项')
def delete_todo_item(item_id):
""" 删除待办事项 """
item = get_todo_item_by_id(item_id)
if item:
session.delete(item)
session.commit()
print(f'待办事项 {item_id} 删除成功')
else:
print(f'没有找到 ID 为 {item_id} 的待办事项')
def main():
# 添加几个待办事项
add_todo_item('学习 Python')
add_todo_item('写论文')
add_todo_item('锻炼身体')
# 查询所有待办事项
items = get_all_todo_items()
print('所有待办事项:')
for item in items:
print(item)
# 更新特定待办事项
update_todo_item(1, title='学习 SQLAlchemy', completed=True)
# 再次查询所有待办事项
items = get_all_todo_items()
print('更新后的所有待办事项:')
for item in items:
print(item)
# 删除特定待办事项
delete_todo_item(2)
# 最后再次查询所有待办事项
items = get_all_todo_items()
print('删除后的所有待办事项:')
for item in items:
print(item)
if __name__ == '__main__':
main()
运行项目
-
保存代码:将上述代码保存为
main.py
。 -
运行脚本:
python main.py
-
查看结果:脚本运行后,你将在控制台中看到以下输出:
数据库连接成功 待办事项 学习 Python 添加成功 待办事项 写论文 添加成功 待办事项 锻炼身体 添加成功 所有待办事项: <TodoItem(title='学习 Python', status=False)> <TodoItem(title='写论文', status=False)> <TodoItem(title='锻炼身体', status=False)> 待办事项 1 更新成功 更新后的所有待办事项: <TodoItem(title='学习 SQLAlchemy', status=True)> <TodoItem(title='写论文', status=False)> <TodoItem(title='锻炼身体', status=False)> 待办事项 2 删除成功 删除后的所有待办事项: <TodoItem(title='学习 SQLAlchemy', status=True)> <TodoItem(title='锻炼身体', status=False)>
摘要
SQLAlchemy 是 Python 编程语言中非常流行的一个 ORM(对象关系映射)工具,它让 Python 代码和数据库之间实现了“心灵交流”。通过本文,你学会了如何安装 SQLAlchemy,如何定义数据库模型,以及如何执行常见的数据库操作,如增加、查询、更新和删除数据。我们通过一个实际的代码示例,展示了一个待办事项应用的创建过程,展示了 SQLAlchemy 的实用性和简洁性。
希望本文能够帮助你快速入门 SQLAlchemy,提高你的数据库开发效率。站在 SQLAlchemy 的肩膀上,你不仅能快速地实现数据存储功能,还能更好地理解和管理复杂的数据关系。继续探索 SQLAlchemy 的更多功能,你会发现,它不仅强大,而且充满魅力。祝你在数据库开发的道路上越走越远,成为一名优秀的 Python 数据库开发者!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)