程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Python&MySQL

Python&MySQL

編輯:MySQL綜合教程

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()
運行結果:
\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved