我是否需要在循环中创建多个数据库连接?

时间:2019-05-28 23:53:12

标签: python sqlite

我正在使用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 个答案:

答案 0 :(得分:1)

效率更高。在每条记录之后提交数据会严重影响性能。

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

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

    connection.commit()
    connection.close()

如果必须具有单独的函数,则将游标而不是db作为参数传递。

答案 1 :(得分:1)

最好先创建一个数据库,然后再创建一个全局变量,最后将其关闭。

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
希望对您有帮助

答案 2 :(得分:0)

如果您的代码可用于多线程或多处理。涉及的连接池将更加高效。 wiki

中的定义
  

在软件工程中,连接池是数据库的缓存   保持连接,以便在以下情况下可以重用连接   以后需要对数据库的请求。连接池是   用于提高在数据库上执行命令的性能。

下面是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()