Django SYNCDB 在添加超级用户时失败(Windows 7, mySQL, Django 1.2.4, mySQL 5.5)
创建超级用户时syncdb失败
Django版本:1.2.4
Python版本:2.6
MySQL服务器:5.5
操作系统:Windows 7
额外信息:MySQL-Python版本1.2.3
复现问题的步骤是什么?
1. 安装上述程序
2. 创建一个项目
3. 运行syncdb
注意:我已经安装了MySQL以支持UTF-8。我还使用CREATE DATABASE mysite_db CHARACTER SET = UTF8;创建了mysite_db数据库。
期望的输出是什么?你看到的是什么?
syncdb创建所需的表如下:
C:\DjangoProjects\mysite>python manage.py syncdb
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no):
我选择了'YES',然后出现了以下错误:
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line
438, in execute_manager
utility.execute()
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line
379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 191,
in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 220,
in execute
output = self.handle(*args, **options)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 351,
in handle
return self.handle_noargs(**options)
File "C:\Python26\lib\site-packages\django\core\management\commands\syncdb.py"
, line 103, in handle_noargs
emit_post_sync_signal(created_models, verbosity, interactive, db)
File "C:\Python26\lib\site-packages\django\core\management\sql.py", line 182,
in emit_post_sync_signal
interactive=interactive, db=db)
File "C:\Python26\lib\site-packages\django\dispatch\dispatcher.py", line 172,
in send
response = receiver(signal=self, sender=sender, **named)
File "C:\Python26\lib\site-packages\django\contrib\auth\management\__init__.py
", line 44, in create_superuser
call_command("createsuperuser", interactive=True)
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line
166, in call_command
return klass.execute(*args, **defaults)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 220,
in execute
output = self.handle(*args, **options)
File "C:\Python26\lib\site-packages\django\contrib\auth\management\commands\cr
eatesuperuser.py", line 71, in handle
User.objects.get(username=default_username)
File "C:\Python26\lib\site-packages\django\db\models\manager.py", line 132, in
get
return self.get_query_set().get(*args, **kwargs)
File "C:\Python26\lib\site-packages\django\db\models\query.py", line 342, in g
et
num = len(clone)
File "C:\Python26\lib\site-packages\django\db\models\query.py", line 80, in __
len__
self._result_cache = list(self.iterator())
File "C:\Python26\lib\site-packages\django\db\models\query.py", line 271, in i
terator
for row in compiler.results_iter():
File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 67
7, in results_iter
for rows in self.execute_sql(MULTI):
File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 73
2, in execute_sql
cursor.execute(sql, params)
File "C:\Python26\lib\site-packages\django\db\backends\util.py", line 15, in e
xecute
return self.cursor.execute(sql, params)
File "C:\Python26\lib\site-packages\django\db\backends\mysql\base.py", line 86
, in execute
return self.cursor.execute(query, args)
File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 175, in execute
if not self._defer_warnings: self._warning_check()
File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 89, in _warning_
check
warn(w[-1], self.Warning, 3)
_mysql_exceptions.Warning: Incorrect string value: '\xED' for column 'username'
at row 1
你使用的是什么版本的产品?在什么操作系统上?
Django版本:1.2.4
Python版本:2.6
MySQL服务器:5.5
操作系统:Windows 7
额外信息:MySQL-Python版本1.2.3
请提供任何其他信息。
我还安装了MySQL C++和ODBC数据库连接器。
任何帮助都非常感谢。
2 个回答
看起来你在开发机器上的登录名里有一个unicode字符,而当 createsuperuser.py
模块试图根据这个用户名查找 User
对象时,它就出错了,因为MySQL不支持这些字符。你可以选择更改MySQL表的排序规则设置,让它接受UTF-8字符,或者使用一个没有unicode字符的用户名(不过这个选择不是很好)。
真正的错误出现在 createsuperuser.py
的第71行,而这个问题源自第59行,具体可以在这里找到:
try:
default_username = getpass.getuser().replace(' ', '').lower()
except (ImportError, KeyError):
# KeyError will be raised by os.getpwuid() (called by getuser())
# if there is no corresponding entry in the /etc/passwd file
# (a very restricted chroot environment, for example).
default_username = ''
# Determine whether the default username is taken, so we don't display
# it as an option.
if default_username:
try:
User.objects.get(username=default_username)
except User.DoesNotExist:
pass
else:
default_username = ''
它是通过 getpass
获取你的用户名,然后试图在 User
表中查找这个用户名。
看起来你的 models.py 文件或者某个数据文件里有 Unicode 字符。你需要把这些文件转换成 UTF-8 格式,并在文件的第一行加上一个注释:
#coding-utf-8
另外,在 Unicode 字符串前面加上 u
,像这样:
name = CharField(maxlength=255, default=u"утф-8 строка");