我正在使用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()
可以看出,每次插入数据记录都会连接并关闭数据库。是否有一种方法仅对所有要处理的数据连接和关闭一次数据库?
答案 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()