【问题标题】:PyMySQL using localhost vs socket incoherant behaviourPyMySQL 使用 localhost 与套接字不连贯的行为
【发布时间】:2020-01-24 13:57:03
【问题描述】:

我正在使用PyMySQL 连接到在本地主机上运行的数据库。我可以在命令行和adminer 中使用用户名/密码组合很好地访问数据库,因此这里的数据库似乎不是问题。

我的代码如下。然而,当使用host="127.0.0.1" 选项时,我得到一个OperationalError 和一个Errno 111使用相同的代码,但通过运行Mariadb 的套接字连接是可以的。

import pymysql.cursors
from pprint import pprint


# This causes an OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")   
# connection = pymysql.connect(
#     host="127.0.0.1",
#     port=3306,
#     user="root",
#     password="S3kr37",
#     db="my_test",
#     )

# This works.
connection = pymysql.connect(
    user="root",
    password="S3kr37",
    db="my_test",
    unix_socket="/var/lib/mysql/mysql.sock"
    )

try:
    with connection.cursor() as cursor:
        sql = "select * from MySuperTable"
        cursor.execute(sql)
        results = cursor.fetchall()
        pprint(results)
finally:
    connection.close()

我做错了什么?

PS:请注意this question 有同样的问题,但提供的解决方案是套接字。 这还不够:我想知道为什么我不能按照文档的建议使用主机名。

【问题讨论】:

    标签: python mysql mariadb pymysql


    【解决方案1】:

    客户端库返回错误代码 2003 (CR_CONN_HOST_ERROR),以防客户端无法与服务器建立 tcp 连接。

    首先,您应该检查您是否可以通过 telnet 或 mysql 命令行客户端连接到您的服务器。 如果不是,请检查服务器配置文件:

    • 服务器是否在 3306 端口上运行?
    • IPv4 被禁用了吗?
    • 是否启用了跳过网络?
    • 绑定地址是否已激活(使用另一个 IP?

    【讨论】:

    • bind-address 是问题所在。呃。谢谢。
    • 当 telnet localhost:3306 尝试连接到 127.0.0.1 时,mysql -hlocalhost -P3306 尝试通过 unix 套接字连接(与 -h127.0.0.1 相对)。所以我不相信你试图通过 telnet 连接。
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2016-09-22
    • 2011-12-19
    • 2018-06-05
    • 2015-12-26
    • 2017-12-26
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多