使用Python 進行數據庫的操做python
爲了能操做數據庫, 首先咱們要有一個數據庫, 因此要首先安裝Mysql, 而後建立一個測試數據庫python_test
用之後面的測試使用sql
CREATE DATABASE `python_test` CHARSET UTF8
import MySQLdb
con = MySQLdb.connect(host="localhost", user="root", passwd="******",db="python_test",port=3306)
在這裏, 咱們雖然拿到了python的數據庫鏈接, 可是不能在這個對象上直接對數據庫進行操做, 還須要獲取對應的操做遊標才能進行數據庫的操做,因此還須要進行下面的操做數據庫
cur = con.cursor()
cur.execute('create table stu_info (name char(128) not null default "", age tinyint(3) not null default 0, sex enum("man","femal") not null default "man") engine=innodb charset=utf8') #0L
cur.execute 返回執行的sql 影響的行數, 由於這裏是建立數據庫, 因此是0L
行安全
但到這裏還並無真正執行了sql語句, 必須使用MySQLdb.commit
纔是真正執行完畢學習
con.commit()
到這裏, 咱們的表格纔算真正建立完成測試
同理, 往表中寫數據, 也是同樣的操做流程 execute ==> commit
fetch
不過, 寫入數據的execute 稍有不一樣, 以下指針
往表中寫入數據時, 執行execute 方法, 有兩種方式, 一種是直接execute(sql)
, 而後commit
完成, sql裏是寫入的sql 語句code
cur.execute("insert into stu_info (name, age, sex) values ('Yi_Zhi_Yu',25,'man')") con.commit()
這會直接寫入表中,但還有另一種方式
. 對象
execute
能夠接受兩個參數, 第一個參數是sql
語句, 不過這個sql中的values的內容使用佔位符%s表示,第二個參數是實際的寫入的values列表, 以下:
cur.execute("insert into stu_info (name, age, sex) values (%s,%s,%s)", ("Tony",25, "man")) con.commit()
這種方式與第一中方式相比, 更清晰一些, 安全性也更好, 能有效防止sql注入
另外, cursor還有一個executemany, 參數和execute同樣, 不過第二個參數能夠傳遞多列表值, 達到屢次執行某個語句的效果
cur.executemany("insert into stu_info (name, age, sex) values (%s,%s,%s)",(("LiMei",26,"femal"),("YuanYuan",28,"femal"))) con.commit()
這裏實際上就是執行了兩次插入操做
直接看例子
cur.execute("select * from stu_info") stus = cur.fetchall()
#stus 已是查詢的結果結合了, 格式以下:
(('Yi_Zhi_Yu', 25, 'man'), ('Tony', 25, 'man'), ('LiMei', 26, 'femal'), ('YuanYuan', 28, 'femal'))
tuple形式, 咱們能夠經過循環輸出
for stu in stus: print "name: %s; age: %d; sex: %s" %(stu[0], stu[1], stu[2])
輸出:
name: Yi_Zhi_Yu; age: 25; sex: man name: Tony; age: 25; sex: man name: LiMei; age: 26; sex: femal name: YuanYuan; age: 28; sex: femal
那上面的查詢雖然獲得了每行的數據, 但結果集中並無字段名, 若是要返回字段名, 以下操做:
cur = con.cursor(cursorclass=MySQLdb.cursors.DictCursor) cur.execute("select * from stu_info") cur.fetchall()
返回的結果集:
({'age': 25, 'name': 'Yi_Zhi_Yu', 'sex': 'man'}, {'age': 25, 'name': 'Tony', 'sex': 'man'}, {'age': 26, 'name': 'LiMei', 'sex': 'femal'}, {'age': 28, 'name': 'YuanYuan', 'sex': 'femal'})
每一個元素都是一個dict, 以key-value的形式展現了每一個字段和對應的值
Python 中對數據的操做, 增刪改均要在指針對象執行了sql語句後, 使用鏈接對象commit, 查詢的結果使用指針對象的fetch系列方法獲取
PS: 以上皆爲學習筆記, 不免有錯, 歡迎指正