Django多数据库,是否会初始连接所有数据库?

5 投票
2 回答
2336 浏览
提问于 2025-04-17 14:44

下面是一个MySQL的示例数据库配置:

DATABASES = {
    'auth_db': {
        'NAME': 'auth_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'swordfish',
    },
    'master': {
        'NAME': 'master',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'spam',
    },
    'slave1': {
        'NAME': 'slave1',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'eggs',
    },
    'slave2': {
        'NAME': 'slave2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'bacon',
    },
}

Django一开始会连接所有数据库吗?即使有些数据库根本没有被使用?比如:

使用原始游标与多个数据库

如果你使用多个数据库,可以通过 django.db.connections 来获取特定数据库的连接(和游标)。django.db.connections 就像一个字典,可以用它的别名来获取特定的连接:

from django.db import connections

cursor = connections['my_db_alias'].cursor()

所以这里有两个问题:

  1. connections对象里面已经有连接了吗?还是说在请求游标的时候才会连接?
  2. 有没有办法改变这个默认行为,让连接在需要的时候才建立?(所有查询都是原始查询,所有数据库都是MySQL)

2 个回答

-1

Django在没有选择其他数据库时,会默认使用一个叫“default”的数据库。如果你没有设置默认数据库,就需要特别注意,每次都要明确指定你想用哪个数据库。在你的情况下,用户认证等功能是不是不需要默认数据库或者auth_db呢?

无论如何,连接数据库应该是按需进行的。你可以连接到MYSQL Explorer,然后输入以下命令来查看当前的活跃连接。接着再请求一个游标,检查一下命令的结果,并进行比较。命令如下...

SHOW PROCESSLIST

http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html

请把你的发现反馈回来。

6

第一次访问数据库时,会通过 django.db.connections 创建一个持久连接。也就是说,连接是懒加载的,只有在第一次使用时才会连接。相关的代码在 django/db/__init__.pyConnectionHandler 类里。

不过,连接在查询后不会自动被移除,连接会一直保持,直到手动断开。如果 DATABASES 中有一些从来没有被使用的数据库,就不会建立连接。

撰写回答