优化 pymssql 代码

0 投票
2 回答
4460 浏览
提问于 2025-04-15 22:04

我正在使用pymssql从Python向SQL Server插入记录。数据库执行一个查询需要2毫秒,但每秒只能插入6行。唯一的问题出在代码上。怎么优化下面的代码,或者有什么更快的方法来插入记录呢?

def save(self):
    conn = pymssql.connect(host=dbHost, user=dbUser, 
                           password=dbPassword, database=dbName, as_dict=True)
    cur = conn.cursor()

    self.pageURL = self.pageURL.replace("'","''")

    query = "my query is there"               
    cur.execute(query)

    conn.commit() 
    conn.close()

2 个回答

3

除了托马斯的好建议之外,
我建议你看看 executemany()比如说

cur.executemany("INSERT INTO persons VALUES(%d, %s)", 
    [ (1, 'John Doe'), (2, 'Jane Doe') ])

...在这里,executemany() 的第二个参数应该是一组要插入的行。

这还引出了另一个要点:
你可能想把你的查询和查询参数作为单独的参数发送给 execute()executemany()。这样可以让 PyMSSQL 模块帮你处理任何引号的问题。

*executemany() 的描述可以在 Python DB-API 中找到:

.executemany(operation,seq_of_parameters)
准备一个数据库操作(查询或命令),然后对在参数序列 seq_of_parameters 中找到的所有参数序列或映射执行它。

4

看起来你在每次插入数据的时候都在创建一个新的连接。这可能是导致速度变慢的主要原因,因为建立新的连接通常是比较慢的。你可以把连接放在方法外面创建,这样你会看到明显的速度提升。你还可以在函数外面创建一个游标(cursor),然后重复使用它,这样也能加快速度。

根据你的具体情况,你可能还想在进行多次插入时使用同一个事务。这样做会稍微改变一些行为,因为一个事务应该是原子的,要么完全成功,要么完全失败。不过,提交一个事务通常是比较慢的操作,因为系统需要确保整个操作都成功了。

撰写回答