我之前使用本地开发服务器编写了我的应用程序,现在我已经将它移动到一个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进行连接,但我不确定如何更改此行为。非常感谢任何帮助。
答案 0 :(得分:0)
不特定于MySQLdb:如果使用localhost
作为主机名,使用MySQL C库的MySQL客户端将尝试使用UNIX套接字(或Windows上的命名管道)进行连接。有两种方法,但您需要授予额外的权限才能使它适用于:
使用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
。< / p>
答案 1 :(得分:0)
我后来发现,虽然数据库服务器在localhost上运行,但它运行在一个非常特定的localhost绑定地址上。在我的情况下,如果我没有注意到phpmyadmin是如何连接的话,这是一个我永远不会尝试的地址。