PyMySQL 使用 localhost 与套接字不连贯的行为

Posted

技术标签:

【中文标题】PyMySQL 使用 localhost 与套接字不连贯的行为【英文标题】:PyMySQL using localhost vs socket incoherant behaviour 【发布时间】: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 有同样的问题,但提供的解决方案是套接字。 这还不够:我想知道为什么我不能按照文档的建议使用主机名。

【问题讨论】:

【参考方案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 连接。

以上是关于PyMySQL 使用 localhost 与套接字不连贯的行为的主要内容,如果未能解决你的问题,请参考以下文章

PYMYSQL 错误 2021(1045,“用户 'root'@'localhost' 的访问被拒绝(使用密码:YES)”)

pymysql模块对数据库的操作与备份

PyMySQL的基本操作

pymysql模块的使用

pymysql模块的使用

16-pymysql模块的使用