OpenShift 中 Python 的 MySQL 连接问题
我之前在本地开发服务器上写了我的应用程序,现在我把它搬到了一个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
,但最好不要用 mysql
或 client
,因为这可能会和其他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
。)