【问题标题】:Using MySQL with Django - Access denied for user '@'localhost将 MySQL 与 Django 一起使用 - 用户“@”localhost 的访问被拒绝
【发布时间】:2012-06-25 13:48:06
【问题描述】:

所以我正在通过这个资源学习 Django (1, 3, 1, 'final', 0):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 确实要求我设置 root 密码,这里可以使用吗?或者是别的什么?

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    我遇到了类似的问题,但所有设置似乎都是正确的。后来我注意到 MySQL 正在使用端口 3308,但我的 Django 设置文件中有端口 3306。我更新了设置文件以解决问题。

    【讨论】:

      【解决方案2】:

      您需要验证 settings.py 文件中的数据库配置,以及您的 db 用户是否有权访问数据库并对其执行操作。

      请查看here 提到的解决方案是否适合您。

      【讨论】:

        【解决方案3】:

        我的问题是我正在编辑 settings.py 而配置应该在 local_settings.py

        中完成

        现在一切似乎都正常了。

        【讨论】:

          【解决方案4】:

          我只想在这里留下我的答案,因为我在这件事上浪费了几分钟(差不多一个小时)。

          注意你的复制粘贴 :) 不幸的是,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 对输出的帮助也不够。 :)

          【讨论】:

            【解决方案5】:

            如果您更改了数据库密码并更新了 settings.py,您还必须重新启动 wsgi.py 进程,例如重新启动 apache。

            【讨论】:

              【解决方案6】:

              我在遵循 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 的临时数据库。
              我能够通过授予对它试图创建的 test_django_mysite 数据库上的“admin”@“localhost”的访问权限来解决这个问题。

              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 的权限。我不需要实际创建它。

              【讨论】:

              • MySQL 糟糕的另一个原因!使用 postgres,我可以使用 create; 来做 $ psql > alter role 'username'就是这样。我今天花了 30 分钟,这是唯一有效的答案!
              【解决方案7】:

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

              查看您的回溯的最后一行,它似乎正在尝试在没有用户名的情况下进行连接。

              尝试改变

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

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

              【讨论】:

              • 我正在使用 Django (1, 3, 1, 'final', 0) 我不知道 DjangoBook 已经过时了。到目前为止,它一直是帮助我学习的好工具,您建议我离开吗?实际上我的 django 设置确实看起来像字典,所以这不是问题。
              【解决方案8】:

              您的用户无权访问数据库。使用以下命令设置您的数据库。

              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;
              

              此外,您需要有足够的权限才能运行它。然后另存为script.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
              

              你就完成了。

              【讨论】:

              • 如果我尝试“DROP DATABASE IF EXISTS mydb;”会出现同样的错误错误 1044 (42000): 拒绝用户 ''@'localhost' 访问数据库 'mydb'
              • 在设置中检查 TEST=True
              猜你喜欢
              • 2015-01-31
              • 2013-08-22
              • 1970-01-01
              • 2012-08-02
              • 2016-07-11
              • 2018-04-26
              • 1970-01-01
              • 2020-11-13
              • 2020-02-04
              相关资源
              最近更新 更多