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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx websocket ip_해시 규칙프로젝트 를 다운로드 한 후 서로 다른 네트워크 에 각각 이 demo 프로젝트 를 배치 합 니 다. 프로젝트 에서 환경 변수 에 따라 시스템 변 수 를 설정 합 니 다. spring.profiles.active=de...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.