python MySQLdb串連mysql失敗(轉載)

來源:互聯網
上載者:User

標籤:

最近瞭解了一下django,資料庫選用了mysql, 在串連資料庫的過程中,遇到一點小問題,在這裡記錄一下,希望能夠對遇到同樣的問題的朋友有所協助,少走一些彎路。關於django,想在這裡也額外說一句。django是很優秀的基於python的web開發架構,對於有python基礎的背景程式員,如果有要做一些前台的需求,強烈推薦django。下面言歸正傳。

    • 1. 問題的現象

下面是串連資料庫的代碼,用的是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)")
    • 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所用的不一樣,這也印證了我們前面的猜想,找到了問題的原因。

    • 3. 解決問題的方法

知道了問題所在,我們就可以對症下藥了,下面提供幾種可以問題的解決方案:
(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‘)
    • 4. 參考文獻

(1)Unix Domain Socket
(2)mysql支援遠端存取

 

參考文章:http://www.wuzesheng.com/?p=2234

 

python MySQLdb串連mysql失敗(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.