SQLAlchemy ORM 的使用

class SQLAlchemy,ORM

SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射(ORM)库,广泛用于处理数据库操作。它提供了低级别的 SQL 表达式语言和高级别的 ORM。使用 SQLAlchemy ORM 可以让你以面向对象的方式与数据库进行交互,而不需要直接编写 SQL 语句。

1. 安装 SQLAlchemy

首先,需要安装 SQLAlchemy:

pip install sqlalchemy

如果你需要与 MySQL 或 PostgreSQL 交互,还需要安装相应的数据库驱动,例如:

pip install pymysql  # MySQL
pip install psycopg2  # PostgreSQL

2. SQLAlchemy ORM 的基础使用

下面我们将展示如何使用 SQLAlchemy ORM 创建一个简单的数据库模型,并进行常见的数据库操作。

2.1 设置数据库连接

SQLAlchemy 支持多种数据库,可以通过 create_engine 函数连接到不同的数据库。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base

# 连接 SQLite 数据库
engine = create_engine('sqlite:///example.db')

# 如果使用 MySQL
# engine = create_engine('mysql+pymysql://user:password@localhost:3306/database')

# 如果使用 PostgreSQL
# engine = create_engine('postgresql://user:password@localhost:5432/database')

# 创建基类,用于继承
Base = declarative_base()

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

2.2 定义模型类

在 SQLAlchemy 中,模型类是 Python 类,用于表示数据库中的表。每个类的实例对应表中的一行数据。

from sqlalchemy import Column, Integer, String

class User(Base):
    __tablename__ = 'users'  # 定义表名

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer, nullable=False)

    def __repr__(self):
        return f"<User(name={self.name}, age={self.age})>"

2.3 创建数据库和表

定义好模型后,需要将其转换为数据库中的表。

Base.metadata.create_all(engine)  # 在数据库中创建所有定义的表

2.4 插入数据

向表中插入数据,可以创建模型类的实例,并将其添加到会话中。

# 创建新用户
new_user = User(name='Alice', age=25)

# 添加到会话
session.add(new_user)

# 提交会话,将数据保存到数据库
session.commit()

2.5 查询数据

通过会话对象查询数据,可以使用 query 方法。

# 查询所有用户
users = session.query(User).all()
for user in users:
    print(user)

# 查询特定用户
alice = session.query(User).filter_by(name='Alice').first()
print(alice)

2.6 更新数据

要更新数据库中的数据,首先需要查询并修改对象,然后提交会话。

# 查询用户
user_to_update = session.query(User).filter_by(name='Alice').first()

# 更新用户数据
if user_to_update:
    user_to_update.age = 26
    session.commit()

2.7 删除数据

删除数据与更新类似,查询到对象后删除它并提交会话。

# 查询用户
user_to_delete = session.query(User).filter_by(name='Alice').first()

# 删除用户
if user_to_delete:
    session.delete(user_to_delete)
    session.commit()

2.8 关闭会话

操作完成后,记得关闭会话和连接。

session.close()

3. 进阶用法

除了基本的 CRUD(创建、读取、更新、删除)操作,SQLAlchemy ORM 还提供了许多高级特性,如:

  • 关系(Relationships):定义表之间的关系,例如一对多,多对多。
  • 复杂查询:支持复杂的 SQL 查询,包括联接、子查询等。
  • 事务管理:提供事务机制,保证数据一致性。

3.1 定义关系

举个例子,假设我们有两个表:UserAddress,一个用户可以有多个地址。可以定义一对多的关系。

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email_address = Column(String(100), nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")

User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

现在你可以轻松地使用 user.addresses 来访问某个用户的所有地址。

3.2 复杂查询

SQLAlchemy 的查询功能非常强大,支持联接(join)、聚合(aggregate)、子查询(subquery)等。

# 查询带有特定 email 地址的用户
query = session.query(User).join(Address).filter(Address.email_address == 'alice@example.com')
result = query.all()
for user in result:
    print(user)

4. 总结

SQLAlchemy ORM 是一个功能强大且灵活的工具,适用于各种规模的项目。它将数据库操作抽象为 Python 对象和方法,让你能够以更加自然的方式进行数据库交互。通过掌握基本的模型定义、会话管理和查询操作,你可以在 Python 中轻松处理复杂的数据库任务。

评论区
评论列表
menu