在使用 Django 1.6.1 与数据库同步后,发现本地设置并没有被应用。 现象:
本地设置 :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_kidsmamma',
'USER': 'test',
'PASSWORD': 'test@pass!@#$',
'HOST': '',
'PORT': '',
'TEST_COLLATION': 'utf8_unicode_ci'
}
}
主设置 :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'kidsmamma',
'USER': 'kidsmamma',
'PASSWORD': 'kidsmamma@pass!@#$',
'HOST': '',
'PORT': '',
'TEST_COLLATION': 'utf8_unicode_ci'
}
}
当使用 ./manage.py shell 命令时,可以正确看到本地设置已被应用:
{'default': {'ENGINE': 'django.db.backends.mysql', 'NAME': 'test_kidsmamma', 'test_COLLATION': 'utf8_unicode_ci', 'HOST': '', 'USER': 'test', 'PASSWORD': 'test@pass!@#$', 'PORT': ''}}
但是,当使用 ./manage.py syncdb 命令与数据库同步后,却发生了错误:
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
output = self.handle(*args, **options)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/core/management/base.py", line 415, in handle
return self.handle_noargs(**options)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/south/management/commands/syncdb.py", line 89, in handle_noargs
db.connection_init()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/south/db/mysql.py", line 183, in connection_init
cursor = self._get_connection().cursor()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 157, in cursor
cursor = self.make_debug_cursor(self._cursor())
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 129, in _cursor
self.ensure_connection()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 124, in ensure_connection
self.connect()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/utils.py", line 99, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 124, in ensure_connection
self.connect()
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 112, in connect
self.connection = self.get_new_connection(conn_params)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 435, in get_new_connection
conn = Database.connect(**conn_params)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/home/kidsmamma/.virtualenvs/kidsmamma/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 193, in __init__
super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (1045, "Access denied for user 'kidsmamma'@'localhost' (using password: YES)")
问题:
- 当我尝试使用
./manage.py syncdb命令与数据库同步时,本地设置未被应用,而是使用了主设置中的数据库连接信息。 - 当我尝试不使用本地设置连接数据库时,则没有问题。
- 我在 Django 版本 1.6.1 中遇到这个问题。
2、解决方案
要解决这个问题,需要确保在同步数据库时使用的是本地设置中的数据库连接信息。
可以通过以下方式实现:
# Import the local settings file
from local_settings import *
# Override the default database settings with the local settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': DB_NAME,
'USER': DB_USER,
'PASSWORD': DB_PASSWORD,
'HOST': DB_HOST,
'PORT': DB_PORT,
'TEST_COLLATION': 'utf8_unicode_ci'
}
}
这样,在同步数据库时,就会使用本地设置中的数据库连接信息,从而避免出现上述问题。
代码示例:
# Import the local settings file
from local_settings import *
# Override the default database settings with the local settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_kidsmamma',
'USER': 'test',
'PASSWORD': 'test@pass!@#$',
'HOST': '',
'PORT': '',
'TEST_COLLATION': 'utf8_unicode_ci'
}
}
现在,当你运行 ./manage.py syncdb 命令时,本地设置中的数据库连接信息就会被使用,从而避免出现上述问题。