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