Twisted - 使用Deferred进行另一个sql查询

时间:2013-06-03 09:29:09

标签: python mysql asynchronous twisted deferred

我有一个基于扭曲的网络应用程序。现在我想实现一个新的数据库设计,但我已经陷入了Deferred对象。

我使用这两个函数将会话写入我的数据库:

def createSession(self, peerIP, peerPort, hostIP, hostPort):
    SessionUUID = uuid.uuid1().hex
    yield self.writeSession(SessionUUID, peerIP, hostIP)

    sid = self.db.runQuery("SELECT id FROM sessions WHERE sid = %s",
                           (SessionUUID,))

    yield sid

@defer.inlineCallbacks
def writeSession(self, SessionUUID, peerIP, hostIP):
    sensorname = self.getSensor() or hostIP

    r = yield self.db.runQuery("SELECT id FROM sensors WHERE ip = %s",
                               (sensorname,))

    if r:
        id = r[0][0]
    else:
        yield self.db.runQuery("INSERT INTO sensors (ip) VALUES (%s)",
                               (sensorname,))
        r = yield self.db.runQuery("""SELECT LAST_INSERT_ID()""")
        id = int(r[0][0])

    self.simpleQuery(
        """
        INSERT INTO sessions (sid, starttime, sensor, ip)
        VALUES (%s, FROM_UNIXTIME(%s), %s, %s)
        """,
        (SessionUUID, self.nowUnix(), id, peerIP))

简而言之: createSession为会话创建一个UUID,并调用writeSession将其写入我的数据库。写完之后,我尝试使用where语句中的UUID选择最后一个插入的ID,并返回结果。

现在我的问题。要更新会话信息,我调用此函数:

def handleConnectionLost(self, sid, args):
self.simpleQuery("UPDATE sessions SET endtime = now() WHERE sid = %s",
                 (sid))

正如您所看到的,我尝试使用createSession中的sid,它是一个Deferred对象而不是整数。如果我做对了,我向handleConnectionLost添加一个Callback,它将在此时运行查询,以便我可以在这里使用该值。但这不是我唯一需要sid的功能。因此,当我需要sid时,每次回调时都会产生开销。

  1. 有没有办法让我的sid作为我的函数的整数?所以我只是一次运行查询?它看起来怎么样?
  2. 当我使用带有now()语句的延迟查询时。将此查询添加到回调函数时是否会使用now(),或者在查询被触发时是否会使用now()

1 个答案:

答案 0 :(得分:0)

  1. 您可以在插入新行后立即获取ID以供日后使用,此处回答了类似的问题:The equivalent of SQLServer function SCOPE_IDENTITY() in mySQL?

  2. 在触发查询时将使用now()