Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyMySQL可以';无法连接到本地主机上的MySQL_Python_Mysql_Mysql Error 2003 - Fatal编程技术网

Python PyMySQL可以';无法连接到本地主机上的MySQL

Python PyMySQL可以';无法连接到本地主机上的MySQL,python,mysql,mysql-error-2003,Python,Mysql,Mysql Error 2003,我正在尝试使用PyMySQL连接到本地主机上的MySQL: 导入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'(111)上的MySQL服务器” 我

我正在尝试使用PyMySQL连接到本地主机上的MySQL:

导入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'(111)上的MySQL服务器”

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

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

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

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

两种猜测:

  • 运行
    mysqladmin variables | grep socket
    获取套接字的位置,然后尝试设置如下连接:

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

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

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

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

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

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

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

  • 运行ssh-fN-l3307:mysql\u主机:3306ssh_user@ssh_host
  • 在我的终端中
  • 然后输入ssh密码
  • conn=pymysql.connect(db='base',user='root',passwd='pwd',host='localhost')

  • 发生此错误的原因是数据库不支持直接链接。

    答案是
    /etc/my.cnf
    中的
    绑定地址设置不正确。这也可能是您的问题,因为套接字方法可以正常工作,但TCP方法不行。

    那些正在从Dockered flask sqlalchemy或使用pymysql连接本地主机MySQL的人,请查看此线程,非常有用。

    这对我来说很有用:

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

    这也没有为我解决问题。我也有类似的问题,但使用sqlalchemy-->pymysql-->mysql可以使用命令行(mysql-h localhost)很好地连接。。。。因此,它确实似乎暗示了PyMySql有点奇怪,尽管它是需要的。我想知道您的
    my.cnf
    文件是否配置不正确。我猜端口配置不正确,MySQLdb足够聪明,可以尝试使用套接字而不是TCP。(在一些讨论中,他们讨论了
    --协议
    )我实际上还没有得到
    我的.cnf
    文件,但PHP似乎能够弄明白
    本地主机应该变成这样。我更喜欢使用
    .sock
    s,不过:)我真的很想知道为什么通过套接字连接可以工作,而不是
    localhost
    。我的意思是,adminer和mysql命令行都可以很好地使用凭据…已经搜索了几天的答案,您的答案最终解决了我的问题:欢迎使用SO!在回答问题之前,请务必阅读现有答案。已经提供了这个答案。与其重复答案,不如投票支持现有答案。在这里可以找到一些写好答案的指南