標籤:
最近瞭解了一下django,資料庫選用了mysql, 在串連資料庫的過程中,遇到一點小問題,在這裡記錄一下,希望能夠對遇到同樣的問題的朋友有所協助,少走一些彎路。關於django,想在這裡也額外說一句。django是很優秀的基於python的web開發架構,對於有python基礎的背景程式員,如果有要做一些前台的需求,強烈推薦django。下面言歸正傳。
下面是串連資料庫的代碼,用的是python的MySQLdb模組:
12345 |
db = MySQLdb.connect(host=‘localhost‘, port=3306, user=‘root‘, passwd=‘root98‘, db=‘mysite‘) |
下面是啟動並執行時候報的錯誤:
1234567 |
Traceback (most recent call last): File "./test_db.py", line 12, in < module> db=‘mysite‘) File "build/bdist.linux-x86_64/egg/MySQLdb/__init__.py", line 81, in Connect File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 187, in __init__ _mysql_exceptions.OperationalError: (2002, "Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2)") |
這裡主要是因為我們串連mysql的時候,host用的是localhost, 實際用的是UNIX Domain Socket(具體見參考文獻(1))來進行通訊的。我們知道,UNIX Domain Socket的地址是一個socket類型的檔案在檔案系統中的路徑,如果這個路徑不存在的話,串連的時候就會失敗。上面提示的錯誤原因是”Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)”,從字面意思上來看,是說無法通過’/var/lib/mysql/mysql.sock’這個socket來串連本地的mysql sever,這時候問題基本就比較明顯了,應該是mysql配置的本地串連的socket不是’/var/lib/mysql/mysql.sock’這個路徑的原因。接下來我們來驗證我們的想法,開啟mysql的設定檔(/etc/my.cnf),我們看到如下的內容:
123456789101112 |
# The following options will be passed to all MySQL clients[client]#password = your_passwordport = 3306socket = /tmp/mysql.sock # The MySQL server[mysqld]bind-address = 10.12.22.98port = 3306socket = /tmp/mysql.sock# ... |
我們可以看到,本地mysql server配置的Unix Domain Socket是/tmp/mysql.sock,與上面python MySQLdb所用的不一樣,這也印證了我們前面的猜想,找到了問題的原因。
知道了問題所在,我們就可以對症下藥了,下面提供幾種可以問題的解決方案:
(1)在python MySQLdb串連的時候,指定所用的unix_socket
123456 |
db = MySQLdb.connect(host=‘localhost‘, port=3306, user=‘root‘, passwd=‘root98‘, db=‘mysite‘, unix_socket=‘/tmp/mysql.sock‘) |
(2)修改本地mysql server的UNIX Domain Socket
123456789101112 |
# The following options will be passed to all MySQL clients[client]#password = your_passwordport = 3306socket = /var/lib/mysql/mysql.sock # The MySQL server[mysqld]bind-address = 10.12.22.98port = 3306socket = /var/lib/mysql/mysql.sock# ... |
(3)修改本地mysql server支援遠端存取(具體見參考文獻(2)),採用普通socket進行串連
12345 |
db = MySQLdb.connect(host=‘10.12.22.98‘, port=3306, user=‘root‘, passwd=‘root98‘, db=‘mysite‘) |
(1)Unix Domain Socket
(2)mysql支援遠端存取
參考文章:http://www.wuzesheng.com/?p=2234
python MySQLdb串連mysql失敗(轉載)