標籤:通過 cursor cep name llb 輸入 資料庫連接 命令列 ble
環境:windows8+Python2.7+MySQL5.6
嘗試過在C/C++中嵌入SQL語言,最終在其複雜“繁瑣”環境配置中敗下陣來,後來發現Python和MySQL比較easy實現,在Python中能夠匯入MySQLdb包。調用已經封裝好的API介面,就能在Python中嵌入SQL語句。實現對資料庫的操作;
Python調用MySQLdb庫函數,首先建立和MySQL資料庫連接connection。定義一個遊標cursor。就能向DBMS傳輸一條條SQL語句,交給DBMS運行。隨後通過API將檢索結果返回。由cursor指標指向;在Python中。僅僅須要通過cursor這個指標調用fetchall或者fetchone方法對檢索結果結合進行訪問;除了檢索,cursor還能夠完畢非常多操作。比如:建立(視圖,表,資料庫等)。增刪改,訪問資料字典(描寫敘述表格模式。顯示資料庫,表格等);之後提交MySQL或者rollback,提交資料或者撤銷對資料庫的操作;
MySQL除了繁瑣的命令列操作介面外,如今有非常多的人性化的可視化介面操作。我使用的是navicat
1.匯入MySQLdb包
在控制台中鍵入 import MySQLdb,假設沒有錯誤提示,則說明能夠成功匯入MySQLdb
2.串連和斷開資料庫
conn = MySQLdb.connect(#建立一個串連。命名為conn host ='localhost',#主機 user ='root',#本機使用者 passwd ='',#password db ='mysql_test_db',#串連資料庫名 )conn.close()
3.定義遊標cursor以及關閉遊標
cur = conn.cursor()cur.close()
註:當然遊標能夠定義多個
4.遊標經常用法。以檢索為例:
sql = "select * from students"cur.execute(sql)print cur.fetchall()
sql中存放的符合MySQL文法規則的SQL語句,cur調用execut方法。將SQL語句傳給DBMS運行,返回值用cur指向;
fetchall()方法擷取全部行。fetchone()方法擷取一行,fetchmany(int i)方法擷取多行(i行);
詳細返回多少行能夠由count = cur.execute(sql)來記錄。
列印結果:
發現列印似乎有問題,解決方案在後面給出。
5.簡單的SQL命令羅列:
建庫:create database database_name;
建表:create table table_name(
屬性名稱 資料類型[其它描寫敘述],
...);
刪庫:drop database database_name;
刪表: drop table table_name;
查詢表格模式:describe table_name;
插入:insert into table_name(column_name,...) values(...);
查詢:select *|column_name,... from table_name where condition;
更新:update table_name set column_name=... where condition;
刪除:delete from table_name where condition;
改動:alter table table_name [add|modify|drop unique];
除了以上操作外還有:
show databases;
use database_name;
close database_name;
show tables;
describe table_name;
注意:delete from table_name僅僅是刪除了表中的資料,表格的模式還在。
6.事務提交
為了保證資料庫操作的原子性(若干的SQL操作組成一個事務,比方類轉賬操作,必須一個賬戶減額,另外一個賬戶增額,這樣才幹正常運營下去;又比方同一時候間同出發終止地點同輛火車會不會買到同樣的座位問題)並發性控制,所以在每一個事務操作完畢後。對其進行錯誤檢測,是否應該提交還是撤銷操作。
分別為conn.commit()和conn.rollback();
7.錯誤檢測:
待深入。能夠使用錯誤捕獲機制try...except...;。
8.可能使用到字串傳參問題:
sql="select aid,sum(dollars) from orders where cid=%s group byaid"cur.execute(sql,[agent])
比方須要依據輸入的agent值,構成完整的SQL語句,當然還能夠是多個參數:
cur.execute(sql,[s1,s2,...])
9.輸出編碼問題:
print cur.fetchall()
或者
print cur.fetchone()
這樣獲得的所有記錄或者是一條記錄,相當於元組,這樣直接列印。輸出的是MySQL的字元編碼,上面範例顯示的utf8編碼,那怎麼才幹顯示正常呢?
逐一列印當中的每個分量:
貼上列印函數:
def connect_width(text, width): stext =text iftype(text)==int or type(text)==long:#假設是數字型須要轉為字元型 stext = str(text) return"%-*s"%(width,stext) def Print_MySqldb_Result(cur): str_result="| " row1="" array_lenth=[] iflen(cur.fetchall())==0: print "cur is null,check your sql select" else: for field_desc in cur.description: if len(field_desc[0])>field_desc[2]: array_lenth.append(len(field_desc[0])) else: array_lenth.append(field_desc[2]) text=connect_width(field_desc[0],field_desc[2]) str_result=str_result+text+" |" lenth=len(str_result) for i in range(lenth): if i==0: row1=row1+"+" else: if i==lenth-1: row1=row1+"+" else: row1=row1+"-" print row1 print str_result print row1 for i in cur: row2="| " k=0 for j in i: text=connect_width(j,array_lenth[k]) row2=row2+text+" |" k=k+1 print row2 print row1
格式化列印效果:
假設顯示中文有問題。或者格式化輸出中英文結合有問題。能夠繼續去尋找對應的方法解決。
主要是解決中文字寬的問題,這裡不給出;
10.Python編碼和MySQL編碼問題:
show variables like ‘char%‘
顯示結果:
預設的編碼為Latin1。這樣須要去MySQL的根資料夾改動my.ini檔案裡改動:
default-character-set=utf8
init_connect=‘SET NAMES utf8‘
加入上這兩行。就可以
附上完整地Python代碼
importMySQLdb def connect_width(text, width): stext =text iftype(text)==int or type(text)==long:#假設是數字型須要轉為字元型 stext = str(text) return"%-*s"%(width,stext) def Print_MySqldb_Result(cur): str_result="| " row1="" array_lenth=[] iflen(cur.fetchall())==0: print "cur is null,check your sql select" else: for field_desc in cur.description: if len(field_desc[0])>field_desc[2]: array_lenth.append(len(field_desc[0])) else: array_lenth.append(field_desc[2]) text=connect_width(field_desc[0],field_desc[2]) str_result=str_result+text+" |" lenth=len(str_result) for i in range(lenth): if i==0: row1=row1+"+" else: if i==lenth-1: row1=row1+"+" else: row1=row1+"-" print row1 print str_result print row1 for i in cur: row2="| " k=0 for j in i: text=connect_width(j,array_lenth[k]) row2=row2+text+" |" k=k+1 print row2 print row1 #print "print ok" conn=MySQLdb.connect( host='localhost', user='root', passwd='', db='mysql_test_db', # charset='utf8', )cur=conn.cursor()while 1: agent =input("Please input cid,input 1 to exit:\n") ifagent==1: break else: #agent = "C1" sql="select aid,sum(dollars) from orders where cid=%s group byaid" cur.execute(sql,[agent]) print "agent_dollars with cid='%s'"%agent Print_MySqldb_Result(cur)#print('run ok')conn.commit()cur.close()conn.close()執行結果:
Python&MySQL