Django 数据库连接
1. Django 如何管理数据库连接?
- Django 通过
ConnectionHandler类来管理所有数据库连接。 - 你平时用的
connections['default']、connections['mydb'],背后就是它在帮你创建和缓存连接。 - 每个线程有自己的数据库连接,互不干扰,保证线程安全。
- 默认没有连接池机制,每个线程只维护一个连接对象。
连接的创建流程
- 读取 settings.py 里的
DATABASES配置。 - 按需补全默认参数(如HOST、PORT等)。
- 动态加载对应数据库后端(如MySQL、PostgreSQL等)。
- 创建连接对象(
DatabaseWrapper),并缓存到当前线程。
连接的获取与关闭
- 通过
connections['default']获取连接。 - 通过
close_all()可以关闭所有线程本地的连接。 - 没有传统意义上的“连接池”,但可以通过
CONN_MAX_AGE设置连接复用时间。
2. Django 如何决定用哪个数据库?(多数据库/分库场景)
- Django 通过
ConnectionRouter类来决定每个数据库操作用哪个数据库。 - 支持多数据库、读写分离、分库分表、迁移控制等高级用法。
路由器的工作机制
- 你可以在 settings.py 里配置
DATABASE_ROUTERS,指定一个或多个“路由器”类。 - 每个路由器可以实现如下方法:
db_for_read(model, **hints):决定读操作用哪个数据库db_for_write(model, **hints):决定写操作用哪个数据库allow_relation(obj1, obj2, **hints):决定两个对象是否允许建立关系allow_migrate(db, app_label, **hints):决定哪些模型可以在指定数据库迁移
- Django 会依次调用所有路由器的方法,只要有一个返回结果就用它。
- 如果都没返回,则用默认数据库。
典型用法举例
1 | |
3. 线程安全与连接池说明
- Django 默认用
threading.local(),每个线程有独立的连接对象。 - 没有内置连接池机制(不像Java那样的池化),高并发场景建议用第三方库或外部池化工具。
- 通过
CONN_MAX_AGE可以让连接在一段时间内复用,但本质上还是“每线程一个连接”。
4. 总结
- Django 的数据库连接管理简单、线程安全,适合大多数Web应用。
- 多数据库和分库分表场景下,路由器机制非常灵活。
- 如果有高并发或连接数有限需求,建议结合第三方连接池方案。
常用API:
from django.db import connectionsconn = connections['default']cursor = conn.cursor()connections.close_all()
Django 数据库连接
https://luffy997.github.io/2025/07/21/Django-数据库连接/