【问题标题】:PyMySQL can't connect to MySQL on localhostPyMySQL 无法连接到本地主机上的 MySQL
【发布时间】:2011-10-16 15:25:44
【问题描述】:

我正在尝试使用 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 方面,但我不知道如何解决。

【问题讨论】:

    标签: python mysql mysql-error-2003


    【解决方案1】:

    两种猜测:

    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)
      

    【讨论】:

    • 有点奇怪,需要它。我想知道您的my.cnf 文件是否配置不正确。我猜端口配置不正确,而 MySQLdb 足够聪明,可以尝试使用套接字而不是 TCP。 (一些讨论here他们谈论--protocol
    • 我实际上并没有得到my.cnf 文件——但PHP 似乎能够弄清楚localhost 应该成为那个文件。不过,我更喜欢使用.socks :)
    • 我真的很想知道为什么通过套接字连接有效但localhost 无效。我的意思是,管理员和 mysql 命令行都可以使用凭据正常工作......
    • 一直在寻找答案,你的答案终于在这里解决了我的问题:stackoverflow.com/questions/60317075/…
    【解决方案2】:

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

    【讨论】:

    • 这对我也没有用。
    • 我遇到了类似的问题,但使用 sqlalchemy --> pymysql --> mysql 可以使用命令行正常连接(mysql -h localhost)....所以它似乎与 pymysql 有牵连
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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')

      这个错误是因为数据库不支持直接链接。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          那些正在努力从 dockerised flask-sqlalchemy 或使用 pymysql 连接本地 MySQL 的人,请查看这个线程,非常有用How to connect locally hosted MySQL database with the docker container

          【讨论】:

            【解决方案7】:

            这对我有用:

            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';
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                您还需要将端口添加到连接中。试试这个,效果很好。

                pymysql(Module Name).connect(host="localhost", user="root", passwd="root", port=8889, db="db_name")
                

                【讨论】:

                • 欢迎来到 SO!在回答问题之前,请务必阅读现有答案。这个答案已经提供了。不要重复答案,而是投票赞成现有的答案。可以在这里找到一些编写好的答案的指南stackoverflow.com/help/how-to-answer
                猜你喜欢
                • 1970-01-01
                • 2011-09-08
                • 2018-04-02
                • 1970-01-01
                • 2022-12-14
                • 1970-01-01
                • 2014-11-06
                相关资源
                最近更新 更多