我有一个基于扭曲的网络应用程序。现在我想实现一个新的数据库设计,但我被 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
它将在此时运行查询,以便我可以在此处使用该值。但这不是我需要 sid 的唯一功能。因此,当我每次需要 sid 时都进行回调时,这将是一笔开销。
- 有没有办法可以将我的 sid 作为整数提供给我的函数?所以我只是运行一次查询?它必须是什么样子?
- 当我使用带有
now()
语句的延迟查询时。now()
当我将此查询添加到我的回调时会使用它还是会在now()
触发查询时使用它?