Нужно ли создавать несколько соединений с базой данных в цикле? - PullRequest
0 голосов
/ 29 мая 2019

Я использую sqllite3 и хочу вставить данные в таблицу.Мой код выглядит примерно так:

def fill_database(db):
     ...
    for record in records:
       add_to_db(db, record)
 ...

def add_to_db(db, record):
   ...
   connection = sqlite3.connect(db)
   cursor = connection.cursor()
   cursor.execute("...")
   connection.commit()
   connection.close()

Как видно, база данных подключена и закрыта для каждой вставки записи данных.Есть ли способ подключить и закрыть базу данных только один раз для всех данных, которые будут обработаны?

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Лучше открыть базу данных один раз в начале и закрыть ее в конце, создав глобальную переменную.

connection = sqlite3.connect(db)
cursor = connection.cursor()
def fill_database():
     ...
    for record in records:
       add_to_db(record)
 ...

def add_to_dbrecord):
   ..
   cursor.execute("...")
   connection.commit()

#end of script
connection.close()

вы можете использовать Singleton Design Pattern, если вы используете классыНадеюсь, это поможет

1 голос
/ 29 мая 2019

Это намного эффективнее.Фиксация данных после каждой записи сильно снижает производительность.

def fill_database(db):
    ...
    connection = sqlite3.connect(db)
    cursor = connection.cursor()

    for record in records:
        cursor.execute("...")

    connection.commit()
    connection.close()

Если вам нужна отдельная функция, передайте курсор в качестве аргумента вместо БД.

0 голосов
/ 29 мая 2019

Если ваш код работает на многопоточность или многопроцессорность. Пул подключений будет более эффективным. Определение из вики

В программной инженерии пул соединений - это кеш базы данных. Соединения поддерживаются, так что соединения могут быть использованы повторно, когда Будущие запросы к базе данных не требуется. Пулы соединений используется для повышения производительности выполнения команд в базе данных.

Ниже приведен пример из sqlalchemy . Пул управляет всеми соединениями автоматически, и вам не нужно создавать новое соединение, когда вам нужно выполнить SQL.

import sqlalchemy.pool as pool

import psycopg2

def getconn():
    c = psycopg2.connect(username='ed', host='127.0.0.1', dbname='test')
    return c

mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)


def fill_database(db):
     ...
    for record in records:
       add_to_db(db, record)
 ...

def add_to_db(db, record):
   ...
   connection = mypool.connect()
   cursor = connection.cursor()
   cursor.execute("...")
   connection.commit()
   connection.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...