使用 SQLAlchemy 和 MySQL:实战示例
什么是 SQLAlchemy
SQLAlchemy 是一个流行的 Python 库,为与 SQL 数据库交互提供了丰富的工具。通过 SQLAlchemy,您可以:
- 向数据库发送原始查询。
- 程序化构造 SQL 语句。
- 使用其对象-关系映射(ORM)将 Python 类映射到数据库表。
SQLAlchemy 非强制使用任何特定功能,因此可以灵活支持多种操作数据库的方法。无论您是否需要编写脚本、开发网络应用或桌面应用,只要需要使用 SQL 数据库与 Python 一起工作,SQLAlchemy 都是理想选择。
本教程涵盖以下内容:
- 设置 SQLAlchemy 2.0 的引擎对象(engine)。
- 使用原生 SQL 语句与数据库交互。
- 使用 ORM 与数据库交互。
准备数据库
以下示例需要一个兼容 MySQL 的数据库。您可以注册 PlanetScale 账户并创建一个新的数据库。
生成数据库连接的步骤包括:
- 点击仪表板底部的“Create”链接。
- 输入数据库名称。
- 选择区域后点击“Create database”按钮。
- 点击 “Connect”,选择“General”以获取数据库凭据。
PlanetScale 提供类似 Git 的分支工作流,用户可以从生产分支创建新分支对架构修改进行测试。这种方式便于在将更改合并到生产架构之前,轻松测试和验证修改。
设置引擎对象
引擎对象用于管理与数据库的连接。在执行任何数据库操作前,必须先设置引擎。
MySQL 数据库连接字符串的格式如下:
Plaintextmysql+<drivername>://<username>:<password>@<server>:<port>/dbname
安装 MySQL 数据库驱动
SQLAlchemy 支持多种数据库,因此需要一个底层库(驱动)连接数据库。本教程使用 mysql-connector-python
驱动,可以通过以下命令安装:
Bashpip install mysql-connector-python
假设用户名、密码、主机名、端口和数据库名分别为 user1
、pscale_pw_abc123
、us-east.connect.psdb.cloud
、3306
和 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 都提供了强大的功能,适合广泛应用场景。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://www.choupangxia.com/2025/09/11/sqlalchemy-mysql/