sqlalchemy不管理数据库服务,仅连接操作已存在数据库;sqlite开箱即用,其他数据库需预先安装运行;建模须显式定义__tablename__和主键,add()后必须commit()才写入。

SQLAlchemy 本身不“管理”数据库——它不创建/删除数据库实例,也不启动服务;它只连接、操作已存在的数据库。本地关系型数据库(如 SQLite、PostgreSQL 本地实例、MySQL 本地安装)需先确保其可被访问,再由 SQLAlchemy 连接和建模。
SQLite 是唯一开箱即用的本地数据库
SQLite 不需要独立服务进程,数据库就是一个 .db 文件,SQLAlchemy 可直接通过 sqlite:///path/to/db.db URL 创建并读写。其他数据库(PostgreSQL、MySQL)必须已安装、运行且有对应用户权限。
-
create_engine("sqlite:///app.db")会自动创建app.db文件(如果不存在),无需提前初始化 - 路径支持相对路径(
sqlite:///./data/app.db)和绝对路径(sqlite:////home/user/app.db),注意三斜杠和四斜杠的区别 - Windows 下路径需用正斜杠或双反斜杠:
sqlite:///C:/project/app.db或sqlite:///C:\project\app.db - SQLite 不支持并发写入,多线程写操作必须加锁或使用
check_same_thread=False(仅限单进程多线程读场景,不解决写冲突)
用 declarative_base() 定义模型时别漏掉 __tablename__
SQLAlchemy ORM 模型必须显式声明表名,否则 Base.metadata.create_all() 不会生成任何表 —— 即使类名是 User,也不会默认映射到 user 表。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 必须写
__tablename__ = "users",不能依赖类名推断 -
id字段要设为primary_key=True,否则session.add()后commit()可能静默失败或报IntegrityError - 字符串字段推荐指定长度:
name = Column(String(80)),SQLite 虽不强制,但 PostgreSQL/MySQL 会因缺失长度报错 - 外键约束需配合
ForeignKey("other_table.id")和relationship(),否则关联查询(如user.posts)会返回空列表而非报错
session.add() 后不 commit() 就没真写入
SQLAlchemy 的 Session 默认启用事务,add() 只把对象标记为“待插入”,真正落盘靠 commit()。常见错误是调用 add() 后直接退出脚本,或忘记捕获异常导致 rollback() 被跳过。
- 务必在
try/except中包裹commit(),出错时显式session.rollback() -
session.flush()可触发 SQL 执行(如获取自增 ID),但不提交事务,适合需要 ID 做后续逻辑但暂不提交的场景 - 避免在循环中频繁
commit()(性能差),批量插入建议用session.bulk_save_objects()或原生execute(insert(...).values([...])) - 使用
session.close()或上下文管理器(with Session(...) as s:)确保资源释放,否则连接可能泄漏
最容易被忽略的是数据库 URL 的驱动名拼写和参数细节:比如 postgresql:// 不能写成 postgres://(新版本 SQLAlchemy 会警告并拒绝连接),mysql+pymysql:// 必须装 pymysql 包,缺一不可。URL 看似简单,却是 70% 的“连不上”问题根源。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










