OpenShift 中 Python 的 MySQL 连接问题

0 投票
2 回答
695 浏览
提问于 2025-04-17 20:43

我之前在本地开发服务器上写了我的应用程序,现在我把它搬到了一个openshift的小服务器上,几乎所有功能都正常,除了mysql连接。

在我的代码中有这么一行:

self.db = MySQLdb.connect(host, username, password, dbname)

当我查看openshift的错误日志时,报告了以下错误:

_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")

我觉得python可能是试图通过UNIX套接字来连接,而不是通过INET套接字,但我不太确定怎么改变这个行为。任何帮助都非常感谢。

2 个回答

0

后来我发现,虽然数据库服务器是在本地运行的,但它使用了一个非常特定的本地绑定地址。在我的情况下,这个地址是我绝对不会想到的,如果我没有注意到phpmyadmin是怎么连接的,我可能根本不会去尝试。

0

这段内容不是专门针对MySQLdb的:如果你把 localhost 作为主机名,使用MySQL C库的客户端会尝试通过UNIX套接字(在Windows上是命名管道)来连接。解决这个问题有两种方法,但你需要额外的权限才能让它们都能工作:

使用IP地址127.0.0.1

可以用IP地址127.0.0.1来代替localhost。这会让MySQL客户端通过TCP/IP来连接。

使用选项文件

另一种方法是通过选项文件强制指定协议。例如,在你的 ~/.my.cnf(或者你想用的任何文件)中,添加以下内容:

[python]
protocol=tcp

现在使用连接参数来读取选项文件和组:

import MySQLdb
cnx = MySQLdb.connect(host='localhost', user='scott', passwd='tiger',
                      read_default_file='~/.my.cnf',
                      read_default_group='python')

组名不一定要是 python,但最好不要用 mysqlclient,因为这可能会和其他MySQL工具冲突(当然,如果你想这样做也可以)。

关于设置权限,你需要使用localhost的IP地址,像这样:

mysql> GRANT SELECT TO yourdb.* TO 'scott'@'127.0.0.1' IDENTIFIED BY ...;

(小提示:像MySQL Connector/Python这样的MySQL数据库驱动并不认为 localhost 有什么特别之处,它们会直接通过TCP/IP连接,你必须明确使用 unix_socket。)

撰写回答