02 安装与连接数据库
本章目标:理解 SQLAlchemy 的两个核心对象 engine 和 Session,学会连接 SQLite / MySQL / PostgreSQL。
1. 安装
pip install sqlalchemy
确认版本是 2.0+:
python -c "import sqlalchemy; print(sqlalchemy.__version__)"
# 应输出 2.0.x 或更高
SQLite 支持是 Python 内置的,不需要装任何额外东西。
2. 数据库连接字符串(URL)
SQLAlchemy 用一个 URL 描述「连哪个数据库」,格式:
数据库类型+驱动://用户名:密码@主机:端口/数据库名
常用示例:
# SQLite:连接(不存在则自动创建)当前目录下的 app.db 文件
"sqlite:///./app.db"
# SQLite:内存数据库,程序退出即消失(适合测试)
"sqlite://"
# MySQL(需要先 pip install pymysql)
"mysql+pymysql://root:password@localhost:3306/mydb"
# PostgreSQL(需要先 pip install psycopg2-binary)
"postgresql+psycopg2://postgres:password@localhost:5432/mydb"
SQLite 的三条斜杠:
sqlite:///后面跟相对路径,sqlite:////absolute/path四条杠是绝对路径(Linux/Mac)。Windows 绝对路径写sqlite:///D:/data/app.db。
3. engine:数据库连接的总管
from sqlalchemy import create_engine
engine = create_engine(
"sqlite:///./app.db",
echo=True, # 打印所有实际执行的 SQL,学习期强烈建议打开!
)
关于 engine 你需要知道:
- 全局只创建一个。它内部维护一个连接池,负责管理与数据库的所有物理连接
- 创建 engine 时并不会真的连接数据库,第一次执行操作时才连
echo=True是学习 SQLAlchemy 的利器:每次操作都能看到 ORM 到底生成了什么 SQL。上线时关掉
SQLite 专属参数
以后配合 FastAPI 使用 SQLite 时需要多传一个参数:
engine = create_engine(
"sqlite:///./app.db",
connect_args={"check_same_thread": False}, # 仅 SQLite 需要
)
原因:SQLite 默认限制连接只能在创建它的线程使用,而 FastAPI 会在不同线程处理请求。这个参数解除限制(配合 Session 的正确用法是安全的)。MySQL/PostgreSQL 不需要这个参数。
4. Session:一次数据库对话
engine 管连接,而实际的增删改查通过 Session 进行。可以把 Session 理解为「一次数据库会话/工作单元」:你把要做的操作告诉它,最后统一提交。
标准配置(这几行以后每个项目都会写,背下来):
from sqlalchemy.orm import sessionmaker
# sessionmaker 创建一个「Session 工厂」,绑定到 engine
SessionLocal = sessionmaker(bind=engine, autoflush=False)
# 需要时创建一个 Session 用
db = SessionLocal()
try:
# ... 在这里做增删改查 ...
db.commit() # 提交事务,修改真正写入数据库
except Exception:
db.rollback() # 出错则回滚,所有修改作废
raise
finally:
db.close() # 用完必须关闭,把连接还给连接池
也可以用 with 语法自动关闭:
with SessionLocal() as db:
...
db.commit()
三个必须理解的概念
① 事务(Transaction):Session 里做的修改(add/delete/更新)都先记在"账上",只有 db.commit() 之后才真正写入数据库。commit 前程序崩了?什么都没写入,数据不会只改一半——这就是事务的原子性。
② rollback:出错时撤销本次会话的所有未提交修改。
③ close:归还连接。不关闭会耗尽连接池,这也是为什么第四部分要用 FastAPI 的 yield 依赖来自动管理。
Session 使用原则(重要)
- engine 全局一个;Session 用完就扔——每个请求/每个任务单元创建一个新 Session,绝不搞全局共享的 Session
- 记住口诀:「一个请求,一个 Session,一个事务」
5. 验证连接
写个脚本 test_conn.py 测试一下(这里临时用 text() 执行原生 SQL,仅用于验证连接,后面都用 ORM):
from sqlalchemy import create_engine, text
engine = create_engine("sqlite:///./app.db", echo=True)
with engine.connect() as conn:
result = conn.execute(text("SELECT 'Hello SQLAlchemy!'"))
print(result.scalar()) # → Hello SQLAlchemy!
运行 python test_conn.py,同时观察 echo 打印的 SQL 日志。看到输出说明连接成功,目录下也多了一个 app.db 文件。
6. MySQL 用户的额外说明(可跳过)
如果你想直接用 MySQL 练习:
- 安装 MySQL Server 并启动(或用 Docker:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:8) - 创建数据库:
CREATE DATABASE mydb CHARACTER SET utf8mb4; - 安装驱动:
pip install pymysql - 连接字符串:
mysql+pymysql://root:password@localhost:3306/mydb
其余所有代码与 SQLite 完全一致。建议新手先用 SQLite 学完教程,再切 MySQL——只需改这一行。
本章小结
- 连接字符串描述连哪个库;SQLite 零配置最适合学习
create_engine()全局一个,echo=True学习期必开sessionmaker造 Session 工厂;每个工作单元一个新 Session- 修改必须
commit()才生效;出错rollback();用完close()
下一章:03-定义数据模型 —— 用 Python 类建表。