【问题标题】:How to connect django developer server to MySQL database?如何将 django 开发者服务器连接到 MySQL 数据库?
【发布时间】:2012-05-19 10:22:40
【问题描述】:

在我开始之前,请尊重我是一个新手,问我你还需要什么信息来解决这个问题,而不是结束这个问题或其他什么。 ;) 好的。我正在尝试将我的 Django 开发人员服务器连接到托管在远程服务器上的 MySQL 数据库。我已经安装了 MySQL 和 MySQL-Python,并在 'settings.py' 中有这些设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'database_name',                      # Or path to database file if using sqlite3.
        'USER': 'database_user',                      # Not used with sqlite3.
        'PASSWORD': 'database_password',                  # Not used with sqlite3.
        'HOST': 'db9.subsys.no',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

当我尝试使用 python manage.py runserver 启动开发者服务器时,我得到了这个:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Python/2.7/site-packages/django/core/management/validation.py", line 103, in get_validation_errors
    connection.validation.validate_field(e, opts, f)
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/validation.py", line 14, in validate_field
    db_version = self.connection.get_server_version()
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 411, in get_server_version
    self.cursor()
  File "/Library/Python/2.7/site-packages/django/db/backends/__init__.py", line 306, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 387, in _cursor
    self.connection = Database.connect(**kwargs)
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/__init__.py", line 81, in Connect
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/connections.py", line 187, in __init__
_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'db9.subsys.no' (60)")

当我将 'HOST': 'db9.subsys.no' 更改为 'HOST': '' 时,我得到了这个:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Python/2.7/site-packages/django/core/management/validation.py", line 103, in get_validation_errors
    connection.validation.validate_field(e, opts, f)
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/validation.py", line 14, in validate_field
    db_version = self.connection.get_server_version()
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 411, in get_server_version
    self.cursor()
  File "/Library/Python/2.7/site-packages/django/db/backends/__init__.py", line 306, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 387, in _cursor
    self.connection = Database.connect(**kwargs)
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/__init__.py", line 81, in Connect
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/connections.py", line 187, in __init__
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'database_user'@'localhost' (using password: YES)")

是否无法使用开发人员服务器连接到 MySQL,或者我需要对数据库进行某种配置?如果您有答案或需要更多信息,请回复。

提前致谢!

【问题讨论】:

标签: python mysql sql database django


【解决方案1】:

如果你想连接到远程 MySQL 服务器,你应该确保三件事:

  1. 服务器正在使用网络而不是套接字(my.cnf 中没有 skip-networking 行),并且服务器正在侦听公共 IP(使用 bind-address)。

  2. 您的防火墙允许远程访问 MySQL 端口,默认为 3306

  3. 允许用户远程访问:

    GRANT ALL ON someDatabase.* to someUser@some.remote.ip IDENTIFIED BY 'foopass';

【讨论】:

  • +1 表示有关授予远程访问权限的注释(假设用户具有此权限)。在尝试任何进一步的 Django 配置之前,请参阅我关于尝试从本地/开发机器上的命令行连接到远程数据库的注释,以及关于根本不使用该数据库进行开发的考虑。
  • @Burhan 感谢您的回答!如何确保“服务器正在侦听公共 IP(使用绑定地址)”?另外,如何使用“GRANT ALL ON someDatabase.* to someUser@some.remote.ip IDENTIFIED BY 'foopass';”-命令?很抱歉成为新手..
  • 首先,找到您的公共 IP,然后编辑服务器的 configuration file 并在 [mysqld] 标题下添加行 bind-address = ip.address.here。重新启动服务器。然后您可以通过运行sudo netstat -ntp | grep 3306 来确认它,您应该会看到mysqld 列出的进程。使用管理员权限登录后从 mysql 提示符 (mysql>) 运行命令 - 通常是 root 用户。
  • +1。请注意这一点 - 除非您知道两个 IP 都是静态的,否则您可能需要考虑使用端口转发(这里是 Putty 的示例 - akadia.com/services/ssh_putty.html)。这将只要求数据库服务器 IP 是静态的(或使用域代替),这意味着您不需要在数据库服务器端的防火墙上打开其他端口(假设您已经具有 SSH 访问权限)。这也意味着您不需要对数据库进行额外配置。
  • 另外,它更容易关闭。由于您将开发服务器连接到数据库服务器,因此您可能希望在某些时候禁用此连接。在端口转发的情况下,这只是关闭 Putty(或您使用的任何东西)的问题。如果您将数据库服务器暴露在托管公司 (?) 网络之外的 IP 范围内,则会增加额外的安全问题,并且您必须撤消您刚刚为禁用此连接所做的一些工作。这更像是一个工作流程问题而不是技术问题。
【解决方案2】:

只是一个快速的健全性检查 - 我假设您将占位符值(例如 *database_name*)替换为实际值?

另外,您是否尝试过首先通过命令行连接到数据库(在本地开发机器上 - 而不是通过某种 SSH 连接到 VPS 等)以检查它是否可以从您正在开发的任何地方访问,例如mysql -u -p?如果不是,这可能意味着您的网络托管公司(我假设这不是您的数据库 - 如果这是错误的,请纠正我和/或查看@Burhan Khalid 的答案)不允许外部连接到该数据库服务器,您将无法从任何软件远程连接 - 这与 Django 无关。在这种情况下,要么联系托管公司以了解要使用的端口号(或者他们的防火墙规则是否允许外部数据库连接),要么使用本地数据库进行开发,然后从您的转储文件中填充生产数据库本地数据库。这是有关此过程的教程 - http://php.about.com/od/learnmysql/ss/mysql_backup.htm

在我看来,这是一种更好的做事方式,因为在本地开发然后上传可能更容易,更实用。如果它最终成为实时数据库并且您运行可以清除表的 manage.py 命令之一,它还可以防止您犯下代价高昂的错误!

【讨论】:

  • @ 只是一个快速的健全性检查 - 我假设你用实际值替换了占位符值(例如 database_name)? - 是的!
  • @nicolas 我认为是这种情况,但是询问(永远不要假设询问者的先验知识)。此外,在默认 (localhost) 输出中,它具有默认值 - "Access denied for user 'database_user'@'localhost' (using password: YES)")。快速查看更新的答案以检查您是否已尝试上述所有方法。
【解决方案3】:

您可以将数据库与开发服务器一起使用。

当您将主机和端口保留为空白时,django 使用默认端口连接到本地计算机上的数据库。在您的情况下,您收到错误消息,因为您在连接到 localhost 上的数据库时使用的用户名或密码不正确。

在连接到远程服务器时,请确保您是 允许远程访问它。 MySQL 不允许远程连接 默认。

另外,请确保您尝试连接的端口 on 未被防火墙阻止。

阅读本文以了解您需要做什么才能允许这种行为:http://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html

我希望这可以帮助您找出解决方案。

【讨论】:

    【解决方案4】:

    尝试在“HOST”:标记后使用 IP 地址而不是“db9.subsys.no”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2011-08-12
      • 2013-07-02
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      相关资源
      最近更新 更多