Django 数据库连接

1. Django 如何管理数据库连接?

  • Django 通过 ConnectionHandler 类来管理所有数据库连接。
  • 你平时用的 connections['default']connections['mydb'],背后就是它在帮你创建和缓存连接。
  • 每个线程有自己的数据库连接,互不干扰,保证线程安全。
  • 默认没有连接池机制,每个线程只维护一个连接对象。

连接的创建流程

  1. 读取 settings.py 里的 DATABASES 配置。
  2. 按需补全默认参数(如HOST、PORT等)。
  3. 动态加载对应数据库后端(如MySQL、PostgreSQL等)。
  4. 创建连接对象(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
2
3
4
5
6
7
8
9
10
11
# settings.py
DATABASE_ROUTERS = ['myproject.db_routers.MyRouter']

# 自定义路由器
class MyRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'analytics':
return 'analytics_db'
return None
def db_for_write(self, model, **hints):
return 'default'

3. 线程安全与连接池说明

  • Django 默认用 threading.local(),每个线程有独立的连接对象。
  • 没有内置连接池机制(不像Java那样的池化),高并发场景建议用第三方库或外部池化工具。
  • 通过 CONN_MAX_AGE 可以让连接在一段时间内复用,但本质上还是“每线程一个连接”。

4. 总结

  • Django 的数据库连接管理简单、线程安全,适合大多数Web应用。
  • 多数据库和分库分表场景下,路由器机制非常灵活。
  • 如果有高并发或连接数有限需求,建议结合第三方连接池方案。

常用API

  • from django.db import connections
  • conn = connections['default']
  • cursor = conn.cursor()
  • connections.close_all()

Django 数据库连接
https://luffy997.github.io/2025/07/21/Django-数据库连接/
作者
Luffy997
发布于
2025年7月21日
许可协议