Python&MySQL
環境:windows8+Python2.7+MySQL5.6
嘗試過在C/C++中嵌入SQL語言,終於在其復雜“繁瑣”環境配置中敗下陣來,後來發現Python和MySQL比較容易實現,在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 ='',#密碼
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()
運行結果: