什么是 SQLAlchemy

SQLAlchemy 是一个流行的 Python 库,为与 SQL 数据库交互提供了丰富的工具。通过 SQLAlchemy,您可以:

  • 向数据库发送原始查询。
  • 程序化构造 SQL 语句。
  • 使用其对象-关系映射(ORM)将 Python 类映射到数据库表。

SQLAlchemy 非强制使用任何特定功能,因此可以灵活支持多种操作数据库的方法。无论您是否需要编写脚本、开发网络应用或桌面应用,只要需要使用 SQL 数据库与 Python 一起工作,SQLAlchemy 都是理想选择。

本教程涵盖以下内容:

  1. 设置 SQLAlchemy 2.0 的引擎对象(engine)。
  2. 使用原生 SQL 语句与数据库交互。
  3. 使用 ORM 与数据库交互。

准备数据库

以下示例需要一个兼容 MySQL 的数据库。您可以注册 PlanetScale 账户并创建一个新的数据库。

生成数据库连接的步骤包括:

  1. 点击仪表板底部的“Create”链接。
  2. 输入数据库名称。
  3. 选择区域后点击“Create database”按钮。
  4. 点击 “Connect”,选择“General”以获取数据库凭据。

PlanetScale 提供类似 Git 的分支工作流,用户可以从生产分支创建新分支对架构修改进行测试。这种方式便于在将更改合并到生产架构之前,轻松测试和验证修改。


设置引擎对象

引擎对象用于管理与数据库的连接。在执行任何数据库操作前,必须先设置引擎。
MySQL 数据库连接字符串的格式如下:

Plaintextmysql+<drivername>://<username>:<password>@<server>:<port>/dbname

安装 MySQL 数据库驱动

SQLAlchemy 支持多种数据库,因此需要一个底层库(驱动)连接数据库。本教程使用 mysql-connector-python 驱动,可以通过以下命令安装:

Bashpip install mysql-connector-python

假设用户名、密码、主机名、端口和数据库名分别为 user1pscale_pw_abc123us-east.connect.psdb.cloud3306 和 sqlalchemy。数据库连接字符串如下:

Plaintextmysql+mysqlconnector://user1:pscale_pw_abc123@us-east.connect.psdb.cloud:3306/sqlalchemy

创建引擎对象

安装驱动后,可以使用以下代码创建引擎:

Pythonfrom sqlalchemy import create_engine

connection_string = "mysql+mysqlconnector://user1:pscale_pw_abc123@us-east.connect.psdb.cloud:3306/sqlalchemy"
engine = create_engine(connection_string, echo=True)

将 echo 设置为 True 可查看 SQLAlchemy 向数据库发送的 SQL 语句。默认情况下,mysql-connector-python 驱动启用 SSL/TLS,无需显式传递连接参数。


使用原生 SQL 语句

创建连接对象

要发送查询,需调用 engine.connect() 创建连接对象。推荐使用 with 语句作为上下文管理器:

Pythonwith engine.connect() as connection:

创建表

创建 example 表的代码如下:

Pythonconnection.execute(text("CREATE TABLE example (id INTEGER, name VARCHAR(20))"))

您可以通过 PlanetScale 的 Web 控制台运行 SHOW tables; 命令验证表是否创建成功。

插入数据

使用以下代码向表中插入数据:

Pythonconnection.execute(text("INSERT INTO example (name) VALUES (:name)"), {"name": "Ashley"})
connection.execute(text("INSERT INTO example (name) VALUES (:name)"), [{"name": "Barry"}, {"name": "Christina"}])
connection.commit()

INSERT 语句需通过 commit() 提交事务保存至数据库。


查询数据

以下代码从表中查询数据:

Pythonresult = connection.execute(text("SELECT * FROM example WHERE name = :name"), dict(name="Ashley"))

for row in result.mappings():
    print("Author:" , row["name"])

查询结果会被映射为字典,每个字典的键为列名。


使用 ORM 写查询

ORM 提供了对象-关系映射——通过类和对象表示数据库的表和行。

定义模型

通过 DeclarativeBase 创建 Base 基类,并用来定义模型:

Pythonclass Base(DeclarativeBase):
    pass

class Author(Base):
    __tablename__ = "author"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))

列用 mapped_column 定义,可设置类型、主键等。

处理关系

为了表示关系,将关系字段定义为其他表的主键。例如,为 Post 模型添加 author_id 映射至 Author 表:

Pythonclass Post(Base):
    __tablename__ = "post"

    id: Mapped[int] = mapped_column(primary_key=True)
    title: Mapped[str] = mapped_column(String(30))
    author_id: Mapped[int]

通过 relationship 添加代码内部的关系:

Pythonposts: Mapped[list["Post"]] = relationship(primaryjoin='foreign(Post.author_id) == Author.id')

对于多对多关系,可使用关联表(association table)管理:

Pythonpost_tag = Table(
    "post_tag",
    Base.metadata,
    Column("post_id", Integer, primary_key=True),
    Column("tag_id", Integer, primary_key=True)
)

创建表

调用 Base.metadata.create_all(engine) 将模型映射的表创建至数据库。

插入数据

通过以下方式插入数据,同时处理表间关系:

Pythonwith Session(engine) as session:
    author = Author(name="David")
    post = Post(title="Python Essentials", author=author)
    session.add(author)
    session.add(post)
    session.commit()

查询数据

使用 ORM 查询方法,例如获取所有 Post:

Pythonstmt = select(Post)
posts = session.scalars(stmt)

for post in posts:
    print(post.title)

总结

通过 SQLAlchemy,您可以轻松用 Python 操作 SQL 数据库。无论是发送原生 SQL 查询、构建 SQL 语句,还是使用 ORM 映射 Python 类至数据库表,SQLAlchemy 都提供了强大的功能,适合广泛应用场景。



使用 SQLAlchemy 和 MySQL:实战示例插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/09/11/sqlalchemy-mysql/