42

我正在尝试使用 PyMySQL 连接到本地主机上的 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, "Can't connect to MySQL server on 'localhost' (111)")

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

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

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

4

9 回答 9

68

两种猜测:

  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)
    
于 2013-01-16T05:01:28.603 回答
11

似乎改变localhost127.0.0.1修复错误,至少在我的配置中。如果没有,我会在其中查找错误tcp sockets connection,当然,将其作为错误发布到pymysqlbugtrack 中。

于 2011-07-31T01:31:12.700 回答
6

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

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    passwd = 'XXXXXXXXX',
    db = 'mysql'
)
于 2016-07-09T18:01:31.767 回答
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')

出现此错误是因为数据库不支持直接链接。

于 2018-12-17T09:49:24.857 回答
1

我问为什么套接字可以工作但 TCP 不能工作,答案是bind-addressin/etc/my.cnf设置不正确。这也可能是您的问题,因为套接字方法工作得很好,但 TCP 方法却不行。

于 2019-09-25T07:51:26.607 回答
1

那些正在努力从 dockerised flask-sqlalchemy 或使用 pymysql 连接本地 MySQL 的人,请查看这个线程,非常有用如何将本地托管的 MySQL 数据库与 docker 容器连接

于 2019-12-17T08:43:21.230 回答
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';
于 2020-05-16T05:14:35.853 回答
0

我在 AWS 上遇到了同样的问题 - 结果是我的安全组阻止了连接。我暂时打开了所有连接,瞧!它连接了!

您是否有任何类型的 FW 或基于主机的 FW 可能会阻止连接?我以为这是我的代码,一切都很好。还要检查您正在连接的端口。

于 2021-10-14T23:48:31.983 回答
-1

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

pymysql(Module Name).connect(host="localhost", user="root", passwd="root", port=8889, db="db_name")
于 2017-12-28T14:36:10.900 回答