PyMySQL无法连接到localhost上的MySQL

时间:2011-07-30 18:31:09

标签: python mysql mysql-error-2003

我正在尝试使用PyMySQL连接到localhost上的MySQL:

import pymysql
conn = pymysql.connect(db='base', user='root', passwd='pwd', host='localhost')

但是(在Python 2.7和Python 3.2上)我收到错误:

  

socket.error:[Errno 111]拒绝连接

     

pymysql.err.OperationalError:(2003,“无法连接到'localhost'上的MySQL服务器'(111)”)

我确定mysqld正在运行,因为我可以使用 mysql 命令或phpMyAdmin进行连接。而且,我可以使用几乎相同的代码在Python 2上使用MySQLdb进行连接:

import MySQLdb
conn = MySQLdb.connect(db='base', user='root', passwd='pwd', host='localhost')

似乎问题出在PyMySQL方面而不是MySQL上,但我不知道如何解决它。

8 个答案:

答案 0 :(得分:47)

两个猜测:

  1. 运行mysqladmin variables | grep socket以获取套接字的位置,并尝试设置如下连接:

    pymysql.connect(db='base', user='root', passwd='pwd', unix_socket="/tmp/mysql.sock")
    
  2. 运行mysqladmin variables | grep port并验证端口是3306.如果没有,您可以手动设置端口,如下所示:

    pymysql.connect(db='base', user='root', passwd='pwd', host='localhost', port=XXXX)
    

答案 1 :(得分:9)

似乎将localhost更改为127.0.0.1可以修复错误,至少在我的配置中是这样。 如果没有,我会在tcp sockets connection中查找错误,当然,将其作为pymysql错误跟踪中的错误发布。

答案 2 :(得分:5)

我通过将localhost替换为127.0.0.1并将密码更改为我的MYSQL数据库密码来解决了这个问题,如下所示;

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    passwd = 'XXXXXXXXX',
    db = 'mysql'
)

答案 3 :(得分:1)

我遇到了同样的问题,我的解决方法如下。

  1. 在我的终端上运行“ ssh -fN -L 3307:mysql_host:3306 ssh_user @ ssh_host”。
  2. 然后输入您的ssh密码
  3. conn = pymysql.connect(db ='base',user ='root',passwd ='pwd',host ='localhost') 发生此错误的原因是因为数据库不直接支持链接。

答案 4 :(得分:0)

您还需要将端口添加到连接中。试试这个,它工作正常。

sed '/version: /{h;s/.*\( [0-9]*\)/echo $((\1+1))/e;x;s/ .*//;G;s/\n/ /}' infile

答案 5 :(得分:0)

I asked why socket worked but not TCP,答案是bind-address中的/etc/my.cnf设置不正确。这也可能是您的问题,因为套接字方法可以正常工作,而TCP方法却不能。

答案 6 :(得分:0)

那些努力从dockerized flask-sqlalchemy或使用pymysql连接本地主机MySQL的人,请调查此线程,非常有用How to connect locally hosted MySQL database with the docker container

答案 7 :(得分:0)

这对我有用:

import pymysql

db = pymysql.connect(host="localhost",port=8889,user="root",passwd="root")
cursor=db.cursor()
cursor.execute("SHOW DATABASES")
results=cursor.fetchall()
for result in results:
    print (result)

如果要查找端口号,请在终端中转到mysql,然后键入:

SHOW VARIABLES WHERE Variable_name = 'hostname';
SHOW VARIABLES WHERE Variable_name = 'port';