http://dev.mysql.com/downloads/connector/python/ python
Select Platform:選擇Platform Independent (Architecture Independent), Compressed TAR ,下載源碼mysql-connector-python-2.1.3.tar.gzmysql
tar xzvf mysql-connector-python-2.1.3.tar.gzlinux
cd mysql-connector-python-2.1.3/sql
sudo python3 setup.py install --with-mysql-capi=/opt/mysql(change to you mysqlserver path)shell
或數據庫
sudo python setup.py install --with-mysql-capi=/opt/mysql(change to you mysqlserver path)api
通常說數據庫服務若是不是安裝在系統默認路徑下的狀況,須要下載源碼本身編譯驅動時指定對應的路徑,本人unixodbc是經過apt-get install來安裝的,所以安裝odbc的python驅動只需簡單的sudo pip3 install pyodbc便可。sqlserver
測試代碼:測試
import mysql.connector conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd', db='you-db') cur = conn.cursor() cur.execute("SET NAMES utf8") cur.execute("SELECT * FROM you-table") for r in cur.fetchall(): print(r) conn.close()
使用python3中文顯示正常、python2則顯示中文對應的utf-8代碼,這是由於python3和python2默認編碼格式不同。fetch
$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getdefaultencoding() 'ascii' >>> quit() $ python3 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getdefaultencoding() 'utf-8'
對字符串類型能夠正常輸出、而對聚合類型(列表、元組 、字典等)不行、如改成如下代碼則python2能夠正常顯示中文了
aa=cur.execute("select * from you-table") info = cur.fetchmany(aa) for ii in info: print ii[0]+' '+ii[1]+' '+ii[2]+' '+ii[3]+...... conn.close()
或者
#得到表中有多少條數據 cur.execute("SET NAMES utf8") aa=cur.execute("select * from you-table") print aa #打印表中的多少數據 info = cur.fetchmany(aa) for tup in info: for ii in tup: print ii cur.close() conn.commit() conn.close()
fetchmany獲得的是字符串的元組,總之要轉化成字符串之後再print中文就沒問題了
下面的例子對python2中文問題做了很好的說明:
$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> a = ['你好','哈哈','呵呵'] >>> print a ['\xe4\xbd\xa0\xe5\xa5\xbd', '\xe5\x93\x88\xe5\x93\x88', '\xe5\x91\xb5\xe5\x91\xb5'] >>> for m in a: ... print m ... 你好 哈哈 呵呵
更通用的寫法
import mysql.connector import sys try: conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd', db='you-db') cur = conn.cursor() cur.execute("SELECT * FROM you-table") data = cur.fetchall() for row in data: for col in row: print col, #python3改成print (col, end=' ') print #python3改成print() except mysql.connector.Error AS e: print ("Error %d: %s" % (e.args[0],e.args[1])) sys.exit(1) finally: if conn: conn.close()
動態sql例子
建表的sql語句
CREATE TABLE `COURSE` ( `CNO` char(6) NOT NULL, `CNAME` char(12) NOT NULL, `TEACHER` char(8) NOT NULL, `TIME` smallint(6) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `STUDENT` ( `SNO` char(7) NOT NULL, `SNAME` char(8) NOT NULL, `SEX` char(2) NOT NULL, `BDATE` date DEFAULT NULL, `DIR` char(16) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `SC` ( `SNO` char(7) NOT NULL, `CNO` char(6) NOT NULL, `GRADE` decimal(6,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `COURSE` ADD PRIMARY KEY (`CNO`); ALTER TABLE `STUDENT` ADD PRIMARY KEY (`SNO`); ALTER TABLE `SC` ADD PRIMARY KEY (`SNO`,`CNO`), ADD KEY `CNO` (`CNO`); ALTER TABLE `SC` ADD CONSTRAINT `SC_ibfk_1` FOREIGN KEY (`SNO`) REFERENCES `STUDENT` (`SNO`) ON DELETE CASCADE ON UPDATE NO ACTION, ADD CONSTRAINT `SC_ibfk_2` FOREIGN KEY (`CNO`) REFERENCES `COURSE` (`CNO`) ON UPDATE NO ACTION;
#coding=utf-8 import mysql.connector conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd', db='you-db') cur = conn.cursor() #查詢成績大於88對應的學生和課程 sql = "SELECT SNAME,CNAME,GRADE FROM STUDENT \ Inner JOIN SC ON STUDENT.SNO = SC.SNO \ Inner JOIN COURSE ON COURSE.CNO = SC.CNO \ WHERE GRADE > '%d'" cur.execute(sql % (88)) data = cur.fetchall() #打印表中的多少數據 for row in data: for col in row: print col, print conn.close()