#python #database #pymysql
#python #База данных #pymysql
Вопрос:
Я написал функцию для подключения к базе данных с использованием pymysql. Вот мой код:
def SQLreadrep(sql):
connection=pymysql.connect(host=############,
user=#######,
password=########,
db=#########)
with connection.cursor() as cursor:
cursor.execute(sql)
rows=cursor.fetchall()
connection.commit()
connection.close()
return rows
Я передаю SQL в эту функцию и возвращаю строки. Тем не менее, я делаю быстрые запросы к базе данных. (Что-то вроде "SELECT sku WHERE object='2J4423K'
).
- Какой способ избежать такого количества подключений?
- Должен ли я избегать такого количества подключений для начала?
- Могу ли я аварийно завершить работу сервера, используя такое количество подключений и запросов?
Ответ №1:
Позвольте мне сначала ответить на ваш последний вопрос. Ваша функция получает соединение, но закрывает его перед возвратом. Итак, я не вижу причин, по которым, если бы вы не были многопоточными или многопроцессорными, вы когда-либо использовали бы более одного соединения одновременно, и вы не должны приводить к сбою сервера.
Способ избежать накладных расходов на создание и закрытие такого большого количества подключений — это «кэшировать» соединение. Одним из способов сделать это было бы заменить вашу функцию классом:
import pymysql
class DB(object):
def __init__(self, datasource, db_user, db_password):
self.conn = pymysql.connect(db=datasource, user=db_user, password=db_password)
def __del__(self):
self.conn.close()
def query(self, sql):
with self.conn.cursor() as cursor:
cursor.execute(sql)
self.conn.commit()
return cursor.fetchall()
Затем вы создаете экземпляр класса DB и вызываете его метод запроса. Когда экземпляр DB будет собран, соединение будет автоматически закрыто.
Комментарии:
1. Спасибо! Я был обеспокоен загрузкой соединений.
2. Альтернативный подход заключается в установке пакета пула соединений pymysql из индекса пакетов Python (PyPI), такого как pymysql-pooling. Это был бы хороший подход, если бы вы выполняли, например, многопоточность и вам действительно требовалось несколько одновременных подключений.