【成人版python基础入门】第八章 SQLAlchemy——与数据库的“心灵交流”

在这里插入图片描述

SQLAlchemy——与数据库的“心灵交流”

在 Python 生态系统中,有许多优秀的库可以帮助开发者与数据库进行交互,而 SQLAlchemy 无疑是最闪耀的明星之一。它不仅仅是一个简单的数据库连接库,更像是一个桥梁,让 Python 代码和数据库之间实现了“心灵交流”。本文将带你深入了解 SQLAlchemy 的特点和优势,学习如何安装和使用 SQLAlchemy,通过一个实际的代码示例展示如何创建一个待办事项应用,帮助你在数据库开发中更加得心应手。

SQLAlchemy 简介

特点

  1. ORM(对象关系映射):SQLAlchemy 最显著的特点是其强大的 ORM 功能,使得开发者可以通过 Python 对象来操作数据库,而无需直接编写复杂的 SQL 语句。
  2. 灵活性:SQLAlchemy 支持多种数据库,包括 SQLite、MySQL、PostgreSQL 等,为你提供了非常大的灵活性。
  3. 事务管理:它内置了事务管理功能,确保数据库操作的一致性和完整性。
  4. 查询语言:SQLAlchemy 提供了丰富的查询语言,使得查询操作更加简洁和直观。
  5. 性能优化:虽然 SQLAlchemy 提供了高级的功能,但它在性能优化方面也做得非常出色,能够生成高效的 SQL 语句。

优势

  • 减少重复代码:通过 ORM,开发者可以减少大量的重复 SQL 代码。
  • 增强代码可读性:SQLAlchemy 的模型和查询语句更加直观和易读。
  • 跨数据库支持:同一个代码可以在不同的数据库之间切换,无需重写逻辑。
  • 强大的社区支持:SQLAlchemy 拥有庞大的社区,可以轻松获取帮助和资源。

风趣的例子

想象一下,你是一名魔法师,拥有一本魔法书(数据库),但这本书是用一种古老的语言(SQL)写的,你很难理解。这时,一位智慧的长老给了你一个魔法指南(SQLAlchemy),这本指南能够将古老的魔法书翻译成你熟悉的语言,使得你能够更加轻松地施展魔法。SQLAlchemy 就是这本魔法指南,它让你能够用 Python 对象来操作数据库,而无需直接接触复杂的 SQL 语句。

安装 SQLAlchemy

安装步骤

  1. 打开魔法洞穴(命令行)

    • Windows:点击 Win + R,输入 cmdPowerShell,按回车键。
    • macOS 和 Linux:打开 Terminal
  2. 安装 SQLAlchemy

    在现代的魔法世界中,我们使用 pip 来安装 SQLAlchemy。就像一位魔法师从魔法商店购买魔法道具一样简单。

    pip install sqlalchemy
    
  3. 安装 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):根据定义的模型创建表。

链接模型

如果你有多个表需要链接,可以使用 ForeignKeyrelationship。例如,我们可以定义一个作者模型,并将其与书籍模型链接。

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'):定义 BookAuthor 之间的关系,并指定反向关系。

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 方法来查询数据,并使用 filterfilter_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

创建项目

  1. 创建项目目录

    mkdir todo_app
    cd todo_app
    
  2. 创建数据库文件

    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()

运行项目

  1. 保存代码:将上述代码保存为 main.py

  2. 运行脚本

    python main.py
    
  3. 查看结果:脚本运行后,你将在控制台中看到以下输出:

    数据库连接成功
    待办事项 学习 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 数据库开发者!

posted @   爱上编程技术  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示