使用MySQL与Django - 用户'@'localhost被拒绝访问

26

我正在通过这个资源学习Django(版本号为1.3.1)。链接是:http://www.djangobook.com/en/2.0/chapter05/

我通过Synaptic安装了"mysql-server"和"python-mysqldb"。我在settings.py文件中更改了相关设置。

上述书籍告诉我们可以在manage.py shell中运行以下命令:

>>> from django.db import connection
>>> cursor = connection.cursor()

运行这些命令后,我收到了以下错误:

OperationalError: (1044, "Access denied for user ''@'localhost' to database 'mydb'")

  Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/django/db/backends/__init__.py", line 250, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/usr/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 322, in _cursor
    self.connection = Database.connect(**kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (1044, "Access denied for user ''@'localhost' to database 'mydb'")

MySQL在我第一次安装时要求我设置根密码,这个密码会被用在这里吗?还是还有其他的密码?

8个回答

31

您的用户没有访问数据库的权限。请使用以下命令设置您的数据库。

DROP DATABASE IF EXISTS `mydb`;
CREATE DATABASE `mydb`
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;

USE 'mysql';
GRANT ALL PRIVILEGES ON mydb.* TO 'mydb_user'@'localhost' IDENTIFIED BY 'your_password'

WITH GRANT OPTION;
FLUSH PRIVILEGES;

另外,您需要有足够的权限才能运行它。将其保存为scrip.sql文件,然后:

$mysql -u root -p < script.sql

然后转到settings.py文件,确保您的数据库设置已经正确设置。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',                  
        'USER': 'mydb_user',             
        'PASSWORD': 'your_password',                  
        'HOST': '',                     
        'PORT': '',                      
    }
}

并且

python manage.py syncdb

然后你就完成了。


2
如果我尝试执行 "DROP DATABASE IF EXISTS mydb;",我会得到相同的错误。错误 1044 (42000):用户''@'localhost'对数据库'mydb'没有访问权限。 - user1265125
在设置中检查TEST=True。 - gdoumenc

4

在按照Django测试教程(https://docs.djangoproject.com/en/dev/intro/tutorial05/)进行测试时,我也遇到了这个问题。尝试对投票应用程序进行测试时,我收到了以下错误:

user@host:~/django/mysite$ python manage.py test polls

Creating test database for alias 'default'...
Got an error creating the test database: (1044, "Access denied for user 'admin'@'localhost' to database 'test_django_mysite'")
Type 'yes' if you would like to try deleting the test database 'test_django_mysite', or 'no' to cancel: 

问题在于Django正在创建一个名为test_django_mysite的临时数据库。
我通过授予'admin'@'localhost'对它试图创建的test_django_mysite数据库的访问权限来解决了这个问题。
mysql> GRANT ALL PRIVILEGES ON test_django_mysite.* TO admin@localhost IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.04 sec)

值得注意的是,我只授予了test_django_mysite的测试权限,而不需要实际创建它。

2
又一个MySQL糟糕的原因!使用Postgres,我能够执行$ psql > alter role 'username' with create; 就这样。今天我花了30分钟时间,这是唯一有效的答案! - Sam Hammamy

0

《Django Book》现在已经相当老了。特别是,数据库设置现在是一个字典,而不是《Django Book》中描述的一堆变量。

看着你回溯信息的最后一行,似乎它正在尝试连接而没有用户名。

尝试更改

DATABASE_ENGINE = ''
DATABASE_NAME = ''
DATABASE_USER = ''
DATABASE_PASSWORD = ''

DATABASES = {
    'default': {
        'ENGINE': '',
        'NAME': ''
        'USER': ''
        # etc
    }
}

我正在使用Django(1, 3, 1,“final”,0)我不知道DjangoBook已经过时了。到目前为止,它一直是帮助我学习的好工具,您建议我放弃它吗?实际上,我的Django设置看起来确实像一个字典,所以那不是问题。 - user1265125

0

我的问题是我在编辑 settings.py 文件,而配置应该在 local_settings.py 文件中完成。

现在一切似乎都正常了。


0
如果您更改了数据库密码并更新了settings.py文件,那么您还需要重新启动wsgi.py进程,例如通过重新启动Apache来实现。

0

我曾遇到类似问题,所有设置都看起来正确。后来我发现MySQL使用的是3308端口,而我的Django设置文件中是3306端口。我更新了设置文件以解决这个问题。


-1

你需要在 settings.py 文件中验证数据库配置,同时检查你的数据库用户是否有权限访问数据库并对其执行操作。

请查看 这里 提到的解决方案是否适用于你。


-1

我会在这里留下我的答案,因为我在这个问题上浪费了几分钟(几乎一个小时)。

注意你的复制粘贴 :) 不幸的是,当授予权限给不存在的用户时,mysql会返回成功,即使是对不存在的数据库...

两个查询:

GRANT ALL PRIVILEGES ON python_user.* TO 'python_db'@'%' WITH GRANT OPTION;

并且:

GRANT ALL PRIVILEGES ON python_db.* TO 'python_user'@'%' WITH GRANT OPTION

将返回成功。虽然我没有名为python_db的用户和名为python_user的数据库。 :) 这很遗憾。这是我的错误,但MySql的输出也不够有帮助。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接