Функция подключения к базе данных для Python

#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. Какой способ избежать такого количества подключений?
  2. Должен ли я избегать такого количества подключений для начала?
  3. Могу ли я аварийно завершить работу сервера, используя такое количество подключений и запросов?

Ответ №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. Это был бы хороший подход, если бы вы выполняли, например, многопоточность и вам действительно требовалось несколько одновременных подключений.