【问题标题】:Twisted - Using a Deferred for another sql queryTwisted - 对另一个 sql 查询使用 Deferred
【发布时间】:2013-05-29 10:08:40
【问题描述】:

我有一个基于扭曲的网络应用程序。现在我想实现一个新的数据库设计,但我被 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 时,每次回调时都会产生开销。

  1. 有没有一种方法可以将我的 sid 作为整数提供给我的函数?所以我只是运行一次查询?它的外观如何?
  2. 当我使用带有now() 语句的延迟查询时。当我将此查询添加到我的回调时它会使用now() 还是会在触发查询时使用now()

【问题讨论】:

    标签: python mysql asynchronous twisted deferred


    【解决方案1】:
    1. 插入新行后可以立即获取 ID 以备后用,类似问题在此回答:The equivalent of SQLServer function SCOPE_IDENTITY() in mySQL?

    2. 当查询被触发时,它将使用 now()

    【讨论】:

    • 1.因为我有其他表,我想将 sid 用作外键,而 UUID 可能有点讨厌。这是最简单的部分,作为我正在做什么或应该做什么的一个很好的例子。 2. 回答,谢谢 :)
    • 是的,但我仍然有问题如何返回此查询的结果。 ;)
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多