MSIPO技术圈 首页 IT技术 查看内容

使用SQLAlchemy库进行数据库操作的基本流程[简单示例]

2024-03-28

SQLAlchemy ORM(Object-Relational Mapping)是 SQLAlchemy 库的一部分,它允许开发者通过对象的方式来操作数据库,而不需要直接编写 SQL 语句。ORM 将数据库中的表映射为 Python 类,表中的每一行数据则映射为相应类的对象,这样开发者就可以使用面向对象的方式来进行数据库操作。

这段代码展示了使用SQLAlchemy库进行数据库操作的基本流程。下面是其中用到的方法和功能的详细介绍:

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

# 设置数据库连接字符串
conn_str = 'sqlite:///examplesqlalchemy.db'

# 创建数据库引擎
engine = create_engine(conn_str)

# 创建基类
Base = declarative_base()


# 定义用户表
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True, nullable=False)
    email = Column(String(100), nullable=False)

# 创建数据库表
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 插入数据
new_user = User(username='john_doe', email='john@example.com')
session.add(new_user)
session.commit()

# 查询数据
users = session.query(User).all()
for user in users:
    print(user.username, user.email)

# 更新数据
user = session.query(User).filter_by(username='john_doe').first()
user.email = 'john_updated@example.com'
session.commit()

# 删除数据
user = session.query(User).filter_by(username='john_doe').first()
session.delete(user)
session.commit()

# 关闭会话
session.close()
  1. create_engine

    • create_engine 方法用于创建一个数据库引擎,它接受一个连接字符串作为参数,指定要连接的数据库的类型和位置。在这个例子中,我们使用 SQLite 数据库,连接字符串是 'sqlite:///examplesqlalchemy.db'。
  2. declarative_base

    • declarative_base 是一个基类工厂函数,它创建一个新的基类,所有的数据模型类都应该继承自这个基类。这样可以使得数据模型类和表格之间建立起关联。
  3. Column

    • Column 是用于定义表格列的类,它接受不同的参数来指定列的属性,例如数据类型、是否是主键、是否唯一等。在这个例子中,我们定义了整型的 id 列和两个字符串类型的列 username 和 email
  4. Base.metadata.create_all(engine)

    • 这行代码通过 Base.metadata.create_all(engine) 创建所有已定义的数据模型类对应的表格结构。它会根据数据模型类中的定义自动生成对应的数据库表格。
  5. sessionmaker(bind=engine)

    • sessionmaker 是一个用于创建数据库会话的类工厂函数,它接受一个绑定的数据库引擎作为参数,用于实例化会话对象。在这个例子中,我们将数据库引擎 engine 绑定到会话生成器上。
  6. session.add(new_user)session.commit()

    • session.add(new_user) 将新创建的 User 对象添加到当前会话中,而 session.commit() 则提交当前会话的所有更改,包括插入操作,将其持久化到数据库中。
  7. session.query(User).all()

    • session.query(User) 是用于创建查询的方法,这里我们查询 User 表中的所有记录。.all() 方法返回查询结果的列表。
  8. session.query(User).filter_by(username='john_doe').first()

    • 这行代码演示了如何使用 filter_by 进行过滤查询,查找 username 为 'john_doe' 的记录,并返回第一条符合条件的记录。
  9. session.delete(user)

    • session.delete(user) 用于从数据库中删除指定的对象,这里我们删除了之前查询到的 user 对象。
  10. session.close()

    • 最后,session.close() 方法关闭了当前会话,释放了数据库连接资源。

------------------

    创建一个简单的 SQLAlchemy ORM 模型,假设我们要创建一个学生信息管理系统,包含学生和课程两个数据表。每个学生可以选择多门课程,而每门课程也可以被多个学生选择。
    定义了三个 ORM 模型类:StudentCourseStudentCourse,分别对应了学生、课程和学生与课程之间的关联表。relationship 方法用于定义类之间的关系,secondary 参数指定了关联表,back_populates 参数表示了双向关系。

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

# 创建数据库引擎
engine = create_engine('sqlite:///students.db', echo=True)

# 声明基类
Base = declarative_base()

# 定义学生模型
class Student(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    courses = relationship('Course', secondary='student_courses', back_populates='students')

# 定义课程模型
class Course(Base):
    __tablename__ = 'courses'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    students = relationship('Student', secondary='student_courses', back_populates='courses')

# 定义学生和课程之间的关联表
class StudentCourse(Base):
    __tablename__ = 'student_courses'
    student_id = Column(Integer, ForeignKey('students.id'), primary_key=True)
    course_id = Column(Integer, ForeignKey('courses.id'), primary_key=True)

# 创建数据表
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 关闭会话
session.close()

ForeignKey 是 SQLAlchemy 中用于定义外键约束的一个类。外键约束用于指定一个列或一组列与另一个表的列之间的关系。在关系型数据库中,外键约束可以确保两个表之间的数据一致性,并且可以建立表之间的关联关系。

*************************

SQLAlchemy 是一个用于 Python 编程语言的 SQL 工具包和对象关系映射(ORM)工具。它允许开发人员使用 Python 语言来管理数据库,通过提供高级的抽象接口,使得操作数据库变得更加简单和高效。以下是 SQLAlchemy 的一些主要特点和功能:

  1. 对象关系映射(ORM)

    • SQLAlchemy 提供了 ORM 功能,可以将数据库表格映射到 Python 对象上,使得开发人员可以直接使用对象来表示和操作数据库中的数据,而不必编写复杂的 SQL 查询语句。
  2. 数据库引擎和连接池

    • SQLAlchemy 提供了数据库引擎和连接池的抽象层,支持多种数据库后端,并且能够有效地管理数据库连接,提高数据库操作的性能和效率。
  3. SQL 表达式语言

    • SQLAlchemy 提供了一种 SQL 表达式语言,可以使用 Python 对象来构建 SQL 查询语句,而不必直接编写原始的 SQL 语句,这样做既方便又安全。
  4. 事务管理

    • SQLAlchemy 支持事务管理,开发人员可以通过会话(Session)来管理数据库操作的事务,确保数据的完整性和一致性。
  5. 查询构建器

    • SQLAlchemy 提供了灵活的查询构建器,开发人员可以使用各种方法来构建复杂的数据库查询,包括过滤、排序、连接等操作,从而实现灵活的数据检索功能。
  6. 自动数据表创建

    • 使用 SQLAlchemy,开发人员可以通过定义 Python 类来表示数据表结构,然后通过调用 create_all() 方法来自动生成对应的数据库表格结构,简化了数据库的初始化过程。
  7. 跨数据库兼容性

    • SQLAlchemy 支持多种数据库后端,包括 MySQL、PostgreSQL、SQLite 等,使得开发人员可以在不同的数据库系统之间无缝切换,而不必修改大量代码。

****************************

SQLAlchemy 2.0 是一个重大更新,引入了许多新功能和更改。以下是 SQLAlchemy 2.0 的一些关键更新:

  1. Async Support: SQLAlchemy 2.0 添加了对异步编程的支持,包括 asyncio 和 trio 库。
  2. New DeclarativeBase API: 在 SQLAlchemy 2.0 中,declarative_base 已被弃用,取而代之的是 DeclarativeBase
  3. New Session API: SQLAlchemy 2.0 中的 sessionmaker 已被弃用,取而代之的是 Session 上下文管理器
  4. Improved Type Hints: SQLAlchemy 2.0 提供了更好的类型提示,支持 PEP-484 类型提示。
  5. New InsertManyValues: SQLAlchemy 2.0 引入了 InsertManyValues 以支持高效的批量插入。
  6. New Select and Update Objects: SQLAlchemy 2.0 引入了新的 Select 和 Update 对象,提供了更好的可读性和更多选项。
  7. Improved Column and Relationship: SQLAlchemy 2.0 中的 Column 和 Relationship 对象已经得到了改进,提供了更好的可读性和更多选项。
  8. 更多的测试和文档: SQLAlchemy 2.0 包括更多的测试和文档,以确保更好的稳定性和兼容性。

当使用 SQLAlchemy 2.0 时,请务必查看 SQLAlchemy 2.0 文档,了解新功能和更改。

以下是一个使用 SQLAlchemy 2.0 版本的示例,其中包括一个简单的 ORM 模型和一个添加新用户的函数。

# your_module.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import DeclarativeBase, Session
from sqlalchemy import create_engine

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    email = Column(String(120), unique=True, nullable=False)

def add_new_user(name, email):
    engine = create_engine('your_database_connection_string')
    Base.metadata.create_all(engine)

    with Session(engine) as session:
        new_user = User(name=name, email=email)
        session.add(new_user)
        session.commit()

# Add a new user
add_new_user('John Doe', 'john.doe@example.com')

在这个示例中,我们创建了一个名为 User 的 SQLAlchemy ORM 模型,并定义了一个名为 add_new_user 的函数,用于向数据库添加新用户。请记得根据实际情况更新 your_database_connection_string 的值。这个示例使用 SQLAlchemy 2.0 版本,其中对 create_engine 和 sessionmaker 进行了更新。现在,我们使用 Session 上下文管理器来处理会话。

 *******************

SQLAlchemy 2.0 是一个强大的Python ORM(对象关系映射)工具,它使得在Python应用程序中与关系数据库进行交互变得更加容易。以下是SQLAlchemy 2.0的一些关键知识点:

1. **ORM和Core**:SQLAlchemy 2.0 包括两个主要部分:ORM(对象关系映射器)和Core(SQL构造器和执行器)。ORM允许将Python类映射到数据库表,并提供了一种使用Python对象而不是手写SQL语句来查询数据库的方法。Core提供了一个底层的API,用于构造和执行SQL语句。
2. **类型支持**:SQLAlchemy 2.0 深入集成了PEP 484类型实践,这意味着您可以使用Python类型直接在ORM和Core中指定列和表达式。这有助于提高代码的可读性和可维护性,并使得IDE和静态分析工具能够更好地理解代码。
3. **SQL表达式 Typing**:SQL表达式、语句和结果集现在有着显式的Typing,该Typing扩展到ORM映射。这允许更好的类型检查和IDE支持。
4. **ORM声明模型**:SQLAlchemy 2.0 引入了新的类型感知语法,用于ORM声明模型。这允许更准确的Typing行为,从语句到结果集的属性。
5. **迁移指南**:如果您正在从SQLAlchemy 1.x系列更新,请务必通过迁移指南确保SQLAlchemy 2.0兼容性。
6. **连接和会话**:在SQLAlchemy中,连接和会话是数据库交互的关键抽象概念。连接代表数据库会话,而会话代表应用程序与数据库的交互。
7. **映射**:映射是将Python类与数据库表相关联的过程。映射允许您使用Python对象而不是手写SQL语句来查询数据库。
8. **查询**:SQLAlchemy 2.0 提供了多种查询数据库的方法。您可以使用ORM查询API或Core查询API。ORM查询API允许您使用Python对象查询数据库,而Core查询API允许您手写SQL语句。
9. **事务**:SQLAlchemy 2.0 支持事务,这意味着您可以在数据库交互中使用事务来确保数据的一致性。
10. **表达式语言**:SQLAlchemy 2.0 提供了一个强大的表达式语言,用于构造SQL语句。表达式语言允许您使用Python代码构造SQL语句,而不是手写SQL语句。

这些知识点是SQLAlchemy 2.0的一个基本概述,如果您需要更详细的信息,请参考[官方SQLAlchemy 2.0文档](https://docs.sqlalchemy.org/en/20/changelog/whatsnew_20.html)。

相关阅读

热门文章

    手机版|MSIPO技术圈 皖ICP备19022944号-2

    Copyright © 2024, msipo.com

    返回顶部