Django多数据库,是否会初始连接所有数据库?
下面是一个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()
所以这里有两个问题:
- connections对象里面已经有连接了吗?还是说在请求游标的时候才会连接?
- 有没有办法改变这个默认行为,让连接在需要的时候才建立?(所有查询都是原始查询,所有数据库都是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__.py
的 ConnectionHandler
类里。
不过,连接在查询后不会自动被移除,连接会一直保持,直到手动断开。如果 DATABASES
中有一些从来没有被使用的数据库,就不会建立连接。