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'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章