Strange Django''BEGIN' - PARAMS =()“查询

时间:2015-06-17 16:30:11

标签: python django sqlite

我正在优化我的代码,这在开始时提出了太多的查询。

我现在几乎达到了最低限度,并且已经开始实现以下目标:

QUERY = 'BEGIN' - PARAMS = ()

这似乎几乎每次都使用,实际上查询次数增加了一倍 - 但我认为它实际上并没有做任何事情(除了打开与DB的连接并浪费时间和CPU)。 / p>

任何人都可以告诉我它是什么,为什么它是必要的,如果不是,我怎么能删除它?

我正在使用django.db.connection.queries查看我的查询。

Django - 1.8 Python - 3.4 用sqlite作为DB。

编辑:

为上下文提供示例有点奇怪,因为我几乎所有需要查询的操作都会导致查询弹出(与我想要的查询一起)。

但这里有几个例子:

创建一个默认时间戳为now的对象:

session = Session()
session.save()

提供以下查询:

QUERY = 'BEGIN' - PARAMS = ()
QUERY = 'INSERT INTO "tracker_session" ("name", "session_date", "number_of_courts", "finished", "session_tracker") VALUES (%s, %s, %s, %s, %s)' - PARAMS = ('', '2015-06-17', 4, False, '')

同样更新一组对象以更改特定属性:

(这里的self只是一个ManyToMany属性的对象 - players

self.players.all().update(available=True)

的产率:

QUERY = 'BEGIN' - PARAMS = ()
QUERY = 'UPDATE "tracker_person" SET "available" = %s WHERE "tracker_person"."id" IN (SELECT U0."id" AS Col1 FROM "tracker_person" U0 INNER JOIN "tracker_session_players" U1 ON ( U0."id" = U1."person_id" ) WHERE U1."session_id" = %s)' - PARAMS = (True, 19)

第二个查询总是我想要的,我不知道第一个QUERY = 'BEGIN' - PARAMS = ()是什么。

1 个答案:

答案 0 :(得分:1)

我相信BEGIN查询是在sqlite后端解决sqlite的怪癖。我想你会在交易之外的每一次写作中看到一个BEGIN。

如果您想深入了解代码,请启动here

因此,您无法对查询进行任何操作,但我不担心,我怀疑它们会对性能产生任何明显的影响。如果您真的担心写入的db性能,那么您可以尝试使用不同的数据库后端。