Python MySQLdb 학습 총화

Python MySQLdb 학습 총화
전송:  http://www.cnblogs.com/coser/archive/2012/01/12/2320741.html
    어떤 응용 프로그램 도 데이터 와 떨 어 질 수 없 기 때문에 python 을 배 울 때 당연히 python 으로 데이터 베 이 스 를 조작 하 는 방법 을 배 워 야 합 니 다.MySQLdb 는 python 이 my sql 데이터 베 이 스 를 조작 하 는 모듈 입 니 다.공식 소개: MySQLdb is an thread-compatible interface to the popular MySQL database server that provides the Python database API. C 에 대응 하 는 인 터 페 이 스 를 번역 한 셈 이다.
   이러한 데이터베이스 인 터 페 이 스 를 사용 하 는 것 은 대부분 연결 데이터 베 이 스 를 실행 하 는 것 입 니 다. - > query - > 데이터 추출 - > 연결 을 닫 는 몇 가지 절차 입 니 다.MySQLdb 는 커 넥 션, Cursor, Result 등 비교적 관건 적 인 대상 을 제공 합 니 다.구체 적 인 사용 절 차 는 간단 하 다. 먼저 쓰 지 않 고 개인 적 으로 중요 하고 주의해 야 할 부분 을 쓴다.
 1. MySQLdb. Connect (host, user, passw, db) 함수 에서 우리 가 자주 사용 하 는 것 은 이 몇 가지 매개 변수 일 뿐 이지 만 그 안에 문자 집합, 스 레 드 안전, ssl 등 도 중요 한 매개 변수 가 많 습 니 다. 사용 할 때 신분 주의 가 필요 합 니 다.
 2. Connection. query () 함 수 를 사용 하여 query 를 진행 하면 connection 대상 은 두 가지 result 를 되 돌려 줍 니 다. 각각 store 입 니 다.result 와 useresult,store_result 는 결 과 를 클 라 이언 트 에 저장 하고 useresult 는 결과 집합 을 server 엔 드 에 저장 하고 연결 을 유지 하 며 server 자원 을 점용 합 니 다.이때 다른 조 회 는 할 수 없다.store 사용 권장result, 결과 집합 (result set) 이 너무 크 거나 limit 를 사용 할 수 없 는 경 우 를 제외 하고.
 3. 추출 (fetch) 데이터 의 반환 형식 은 대부분 세 가지 상황 이 있다. as a tuple(how=0) ;as dictionaries, key=column or table.column if duplicated(how=1);as dictionaries, key=table.column (how=2)
 4. 매번 fetch, result 내부 에서 데이터 위치 이동 이 발생 합 니 다. 즉, 10 줄 의 데이터 가 있 으 면 result. fetch 를 실행 합 니 다.row (3, 0), 앞의 세 줄 을 얻 고 result. fetch 를 실행 합 니 다.row (3, 0) 는 중간 세 줄 을 얻 을 수 있 기 때문에 fetch 는 position 의 이동 을 초래 할 수 있 습 니 다.또한 주의해 야 할 것 은 use 를 사용 하면result, 즉 데이터 가 server 에 저 장 될 때 fetch 모든 항목 전에 query 작업 을 할 수 없습니다.
 5. mysql 자 체 는 커서 (Cursor) 를 지원 하지 않 지만 MySQLdb 는 Cursor 를 모방 했다.중요 한 실행 query 방법 은 execute 와 execute many 가 있 습 니 다.execute 방법 은 하나의 sql 문 구 를 실행 하고 execute many 방법 을 호출 하 는 것 이 좋 습 니 다. 데이터 베이스 성능 병목 의 큰 부분 은 네트워크 IO 와 디스크 IO 가 여러 개의 insert 를 함께 놓 고 한 번 만 IO 를 실행 하면 데이터 베이스 성능 을 효과적으로 향상 시 킬 수 있 습 니 다.커서 커서 는 fetchone, fetchmany, fetchall 세 가지 방법 으로 데 이 터 를 추출 합 니 다. 모든 방법 은 커서 가 움 직 이기 때문에 커서 의 위 치 를 주목 해 야 합 니 다.커서 의 scroll (value, mode) 방법 은 커서 를 말 아 올 릴 수 있 습 니 다. mode 매개 변 수 는 현재 위치 (relative) 에 비해 절대적 인 위치 (absolute) 로 이동 할 지 지정 합 니 다.
 6. MySQLdb 는 많은 함수 방법 을 제 공 했 습 니 다. 공식 안내 에 완전히 나열 되 지 않 았 습 니 다. 사용 자 는 help 로 볼 수 있 고 그 안에 편리 한 것 을 많이 제공 합 니 다.
 7. my sql 에 있어 서 사 무 를 지원 하 는 저장 엔진 을 사용 하면 매번 작업 을 한 후에 commt 는 필수 적 입 니 다. 그렇지 않 으 면 데이터 베 이 스 를 진정 으로 기록 하지 않 고 rollback 에 대응 하여 해당 하 는 스크롤 백 을 할 수 있 지만 commt 후 에는 rollback 을 다시 쓸 수 없습니다.commt () 는 많은 sql 명령 을 실행 한 후에 다시 호출 할 수 있 습 니 다. 그러면 성능 을 적당 하 게 향상 시 킬 수 있 습 니 다.
 8. executemany 가 너무 많은 명령 을 처리 하 는 것 도 좋 은 것 은 아 닙 니 다. 데이터 가 server 엔 드 에 함께 들 어 오 면 server 엔 드 의 buffer 가 넘 칠 수 있 고 한 번 의 데이터 양 이 너무 많 으 면 예상 치 못 한 번 의 번 거 로 움 이 생 길 수 있 습 니 다.합 리 적 이 고, 차례 별로 executmany 를 나 누 는 것 이 좋 은 방법 이다.
  마지막 으로 저 는 pyMysql 모듈 을 썼 습 니 다. 주로 MySQLdb 가 제공 하 는 일반적인 방법 에 대해 간단 한 재 포장 을 했 고 이 기 회 를 빌려 MySQLdb 를 잘 배우 고 python 의 인 코딩 을 연습 했 습 니 다.이 프로그램 이 사용 하 는 데이터베이스 시트 는 my isam 엔진 을 사용 하기 때문에 commt () 를 추가 하지 않 았 습 니 다. 일반적으로 추가 하 는 것 이 좋 습 니 다.
코드 는 다음 과 같 습 니 다: PyMysql. py
?
#-*- encoding:gb2312 -*-_
'''
Created on 2012-1-12
@author: xiaojay
'''
importMySQLdb
importMySQLdb.cursors
 
STORE_RESULT_MODE=0
USE_RESULT_MODE=1
 
CURSOR_MODE=0
DICTCURSOR_MODE=1
SSCURSOR_MODE=2
SSDICTCURSOR_MODE=3
 
FETCH_ONE=0
FETCH_MANY=1
FETCH_ALL=2
 
classPyMysql:
    def__init__(self):
        self.conn=None
        pass
    defnewConnection(self,host,user,passwd,defaultdb):
        """
               ,  host、   、  、     
        """
        self.conn=MySQLdb.Connect(host,user,passwd,defaultdb)
        ifself.conn.open==False:
            raiseNone
    defcloseConnnection(self):
        """
              
        """
        self.conn.close()
     
    defquery(self,sqltext,mode=STORE_RESULT_MODE):
        """
          :  connection   query  ,       (    (int),   (result))
          :sqltext:sql  
             mode=STORE_RESULT_MODE(0)     store_result,mode=USESTORE_RESULT_MODE(1)     use_result
          :  (    (int),   (result)
        """
        ifself.conn==Noneor self.conn.open==False:
            return-1
        self.conn.query(sqltext)
        ifmode ==0 :
            result=self.conn.store_result()
        elifmode ==1 :
            result=self.conn.use_result()
        else:
            raiseException("mode value is wrong.")
        return(self.conn.affected_rows(),result)
     
    deffetch_queryresult(self,result,maxrows=1,how=0,moreinfo=False):
        """
          :result: query      
            maxrows:        
            how:          
             (0:tuple,1:dictionaries with columnname,2:dictionaries with table.columnname)
            moreinfo             (num_fields,num_rows,num_fields)
          :  (   ,    ( moreinfo=False)      ( moreinfo=True)
        """
        ifresult ==None : returnNone
        dataset= result.fetch_row(maxrows,how)
        ifmoreinfo isFalse :
            returndataset
        else:
            num_fields=result.num_fields()
            num_rows=result.num_rows()
            field_flags=result.field_flags()
            info=(num_fields,num_rows,field_flags)
            return(dataset,info)
         
    defexecute(self,sqltext,args=None,mode=CURSOR_MODE,many=False):
        """
          :    (cursor) execute   query
          :sqltext:   sql  
             args: sqltext   
             mode:          
                CURSOR_MODE = 0 :store_result , tuple
                DICTCURSOR_MODE = 1 : store_result , dict
                SSCURSOR_MODE = 2 : use_result , tuple
                SSDICTCURSOR_MODE = 3 : use_result , dict 
             many:        (executemany)
          :  (    (int),  (Cursor))
        """
        ifmode ==CURSOR_MODE :
            curclass=MySQLdb.cursors.Cursor
        elifmode ==DICTCURSOR_MODE :
            curclass=MySQLdb.cursors.DictCursor
        elifmode ==SSCURSOR_MODE :
            curclass=MySQLdb.cursors.SSCursor
        elifmode ==SSDICTCURSOR_MODE :
            curclass=MySQLdb.cursors.SSDictCursor
        else:
            raiseException("mode value is wrong")
         
        cur=self.conn.cursor(cursorclass=curclass)
        line=0
        ifmany ==False :
            ifargs ==None : 
                line=cur.execute(sqltext)
            else:
                line=cur.execute(sqltext,args)
        else:
            ifargs ==None :
                line=cur.executemany(sqltext)
            else:
                line=cur.executemany(sqltext,args)
        return(line , cur )
     
    deffetch_executeresult(self,cursor,mode=FETCH_ONE,rows=1):
        """
          :  cursor      
          :cursor:  
             mode:      
              FETCH_ONE:     ; FETCH_MANY :  rows  ;FETCH_ALL :     
             rows:    
          :fetch   
        """
        ifcursor ==None : 
            return
        ifmode ==FETCH_ONE :
            returncursor.fetchone()
        elifmode ==FETCH_MANY :
            returncursor.fetchmany(rows)
        elifmode ==FETCH_ALL :
            returncursor.fetchall()
         
if__name__=="__main__":
    printhelp (PyMysql)
  
    :
?
#-*- encoding:gb2312 -*-
importPyMysql
 
"""
authors       。
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| author_id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| author_last  | varchar(50) | YES  |     | NULL    |                |
| author_first | varchar(50) | YES  | MUL | NULL    |                |
| country      | varchar(50) | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
              。
"""
 
defprintAuthors(res,mode=0,lines=0):
    """
         
    """
    print"*"*20," lines: ",lines ," ","*"*20
    ifmode==0 :
        forauthor_id , author_last , author_first , country inres :
            print"ID : %s , Author_last : %s , Author_First : %s , Country : %s" \
            %(author_id , author_last , author_first , country )
    else:
        foritem inres :
            print"-----------"               
            forkey initem.keys():
                printkey ," : ",item[key]
 
#    
mysql=PyMysql.PyMysql()
mysql.newConnection(
        host="localhost",
        user="root",
        passwd="peterbbs",
        defaultdb="bookstore")
""
#  sql  
sqltext="select * from authors order by author_id "
#  query  ,  result
lines , res =mysql.query(sqltext, mode=PyMysql.STORE_RESULT_MODE)
#    
data=mysql.fetch_queryresult(res, maxrows=20, how=0, moreinfo=False)
#  
printAuthors(data,0,lines)
 
#      
sqltext="insert into authors (author_last,author_first,country) values (%s,%s,%s)"
args=[('aaaaaa','bbbbbb','cccccc'),('dddddd','eeeeee','ffffff'),('gggggg','hhhhhh','iiiiii')]
lines ,cur =mysql.execute(sqltext,args,mode=PyMysql.DICTCURSOR_MODE,many=True)
print"*"*20, lines ,"     ","*"*20
 
sqltext="select * from authors order by author_id "
#  cursor.execute  ,  result
lines ,cur =mysql.execute(sqltext,mode=PyMysql.DICTCURSOR_MODE)
#    
data=mysql.fetch_executeresult(cur, mode=PyMysql.FETCH_MANY, rows=20)
#  
printAuthors(data,1,lines)
 
#    
mysql.closeConnnection()
  
    :
 ******************** lines: 5 ********************
ID : 1 , Author_last : Greene , Author_First : Graham , Country : United Kingdom
ID : 4 , Author_last : Peter , Author_First : David , Country : China
ID : 5 , Author_last : mayday , Author_First : Feng , Country : France
ID : 6 , Author_last : zhang , Author_First : lixin , Country : France
ID : 9 , Author_last : zhang111 , Author_First : lixin , Country : France
******************** 3      ********************
******************** lines: 8 ********************
-----------
country : United Kingdom
author_id : 1
author_first : Graham
author_last : Greene
-----------
country : China
author_id : 4
author_first : David
author_last : Peter
-----------
country : France
author_id : 5
author_first : Feng
author_last : mayday
-----------
country : France
author_id : 6
author_first : lixin
author_last : zhang
-----------
country : France
author_id : 9
author_first : lixin
author_last : zhang111
-----------
country : cccccc
author_id : 53
author_first : bbbbbb
author_last : aaaaaa
-----------
country : ffffff
author_id : 54
author_first : eeeeee
author_last : dddddd
-----------
country : iiiiii
author_id : 55
author_first : hhhhhh
author_last : gggggg

좋은 웹페이지 즐겨찾기