Python 학습 (29) - pymysql 조작 데이터베이스 최적화
우리 가 이전에 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.