sqlalchemy连接mysql时报错

今天在使用sqlalchemy连接mysql时报以下错误:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)”)

上网查找原因,大部分回答主要集中在以下几点:

  1. 是否安装mysql  server,如果没有则安装并启动。

  2. 查看mysqld是否启动,通过service mysql status来查看,如果没有启动,则通过service mysql start来启动。

  3. 通过以下几种方法确认mysql的socket 文件位置:

在mysql中执行:

mysql> show variables like 'socket';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| socket        | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)

或者通过/etc/my.cnf中的[mysqld]查看socket配置项:

# The MySQL server
[mysqld]
datadir   = /var/lib/mysql
port      = 3306
socket    = /tmp/mysql.sock

或者通过ps -ef | grep mysqld查看socket配置项:

[root@centos python]# ps -ef | grep mysqld
mysql    10707     1  0 12:26 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql    11051 10707  0 12:26 ?        00:00:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=VM_21_76_centos.err --pid-file=VM_21_76_centos.pid --socket=/tmp/mysql.sock --port=3306
root     14980  3831  0 13:08 pts/7    00:00:00 grep --color=auto mysqld

通过实践,确认1、2都没问题,通过3确认了mysql的socket文件是/tmp/mysql.sock。现在的问题就比较明显了,sqlalchemy在连接mysql时用的socket文件是/var/lib/mysql/mysq.sock,而各种配置表明这不是mysql运行时的socket文件,且这个文件压根不存在!

为什么sqlalchemy在连接mysql时用的是这个socket文件?不得而知,想去弄清楚,但一番努力后放弃了,希望有大神能指点一下。虽然不知道为什么会这样,但可以通过在sqlalchmey的connection url中指定socket文件的路径来绕过这个问题。即设置connection url为下面的格式:

url = 'mysql://user:password@localhost/your_db?unix_socket=/tmp/mysql.sock'

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值