Python 학습 (29) - pymysql 조작 데이터베이스 최적화

다음으로 전송:http://www.cnblogs.com/liwenzhou/articles/8283687.html
 
우리 가 이전에 pymy sql 을 사용 하여 데이터 베 이 스 를 조작 하 는 작업 은 모두 보기 함수 에 쓰 여 있 었 고 중복 되 는 코드 가 많 았 습 니 다.
우 리 는 중 복 된 코드 를 추출 하여 함수 로 쓸 수 있 도록 최적화 할 수 있다.
import pymysql

#              
DB_CONFIG = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "passwd": "root1234",
    "db": "mysite",
    "charset": "utf8"
}


#         
def get_list(sql, args=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        port=DB_CONFIG["port"],
        user=DB_CONFIG["user"],
        passwd=DB_CONFIG["passwd"],
        db=DB_CONFIG["db"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, args)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result


#         
def get_one(sql, args=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        port=DB_CONFIG["port"],
        user=DB_CONFIG["user"],
        passwd=DB_CONFIG["passwd"],
        db=DB_CONFIG["db"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, args)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result


#     
def modify(sql, args=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        port=DB_CONFIG["port"],
        user=DB_CONFIG["user"],
        passwd=DB_CONFIG["passwd"],
        db=DB_CONFIG["db"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()


#     
def create(sql, args=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        port=DB_CONFIG["port"],
        user=DB_CONFIG["user"],
        passwd=DB_CONFIG["passwd"],
        db=DB_CONFIG["db"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, args)
    conn.commit()
    #             ID
    last_id = cursor.lastrowid
    cursor.close()
    conn.close()
    return last_id

이렇게 하면 데이터 베 이 스 를 연결 하여 조작 해 야 할 때 우리 가 위 에서 정의 한 함수 만 호출 하면 된다.
 
그러나 이것 도 문제 가 있 습 니 다. 제 가 데 이 터 를 대량으로 만 들 려 고 할 때 create 방법 을 여러 번 호출 해 야 합 니 다. 여러 번 연결 해서 제출 하 는 것 과 같 습 니 다.
데이터 베 이 스 를 한 번 만 연결 하면 여러 번 작업 할 수 있 도록 최적화 할 수 있 습 니 다.
class SQLManager(object):

    #        
    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()

    #      
    def connect(self):
        self.conn = pymysql.connect(
            host=DB_CONFIG["host"],
            port=DB_CONFIG["port"],
            user=DB_CONFIG["user"],
            passwd=DB_CONFIG["passwd"],
            db=DB_CONFIG["db"],
            charset=DB_CONFIG["charset"]
        )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    #       
    def get_list(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchall()
        return result

    #       
    def get_one(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchone()
        return result

    #     SQL  
    def moddify(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()

    #          
    def create(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()
        last_id = self.cursor.lastrowid
        return last_id

    #      cursor   
    def close(self):
        self.cursor.close()
        self.conn.close()

우 리 는 우리 데이터 뱅 크 의 관련 작업 을 모두 하나의 유형 으로 밀봉 하고 사용 할 때 하나의 인 스 턴 스 를 만 들 고 인 스 턴 스 에 해당 하 는 조작 방법 을 호출 하면 된다.
db = SQLManager()
class_list = db.get_list("select id, name from class")
teacher_info = db.get_list("SELECT teacher.id, teacher.name, teacher2class.class_id FROM teacher  LEFT JOIN teacher2class ON teacher.id = teacher2class.teacher_id WHERE teacher.id=%s;", [teacher_id])
db.close()

그러나 제 가 여러 개의 생 성 작업 을 대량으로 수행 하려 면 데이터베이스 연결 을 한 번 만 만 만 들 었 지만 여러 번 제출 합 니 다. 한 번 의 연결 로 바 꾸 고 한 번 에 제출 할 수 있 습 니까?
네, pymysql 의 executmany () 방법 만 사용 하면 됩 니 다.
우리 의 SQLManager 클래스 에 대량 실행 을 추가 합 니 다. multi_modify () 방법 이면 됩 니 다.
#     SQL  
def multi_modify(self, sql, args=None):
    self.cursor.executemany(sql, args)
    self.conn.commit()

지금 우리 가 한 번 에 여러 개의 생 성 작업 을 수행 하면 multi 를 사용 할 수 있 습 니 다.modify () 방법 은 한 번 의 연결 을 실현 하고 한 번 에 제출 합 니 다.
마지막 으로, 우 리 는 매번 데이터 베 이 스 를 조작 한 후에 수 동 으로 닫 아야 합 니 다. 자동 으로 닫 는 것 으로 쓸 수 있 습 니까?
이전에 배 운 파일 작업 을 연상 합 니 다. with 문 구 를 사용 하면 들 여 쓰기 가 끝나 고 파일 핸들 을 자동 으로 닫 는 예 를 들 수 있 습 니 다.
데이터베이스 연결 클래스 인 SQLManager 클래스 를 최적화 하여 with 문 구 를 지원 합 니 다.
class SQLManager(object):

    #        
    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()

    #      
    def connect(self):
        self.conn = pymysql.connect(
            host=DB_CONFIG["host"],
            port=DB_CONFIG["port"],
            user=DB_CONFIG["user"],
            passwd=DB_CONFIG["passwd"],
            db=DB_CONFIG["db"],
            charset=DB_CONFIG["charset"]
        )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    #       
    def get_list(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchall()
        return result

    #       
    def get_one(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchone()
        return result

    #     SQL  
    def moddify(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()

    #     SQL  
    def multi_modify(self, sql, args=None):
        self.cursor.executemany(sql, args)
        self.conn.commit()

    #          
    def create(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()
        last_id = self.cursor.lastrowid
        return last_id

    #      cursor   
    def close(self):
        self.cursor.close()
        self.conn.close()

    #   with      
    def __enter__(self):
        return self
    
    #   with       
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

현 단계 에서 우 리 는 이 단계 까지 만 최적화 하면 된다. 뒤의 프로젝트 는 실전 에서 계속 최적화 될 것 이다.데이터베이스 연결 풀 등 을 사용 합 니 다.
다음으로 전송:https://www.cnblogs.com/Coufusion/p/8298445.html

좋은 웹페이지 즐겨찾기