1

私はツイスト ベースのネットワーク アプリケーションを持っています。今、新しいデータベース設計を実装したいと思っていますが、Deferred オブジェクトに行き詰まっています。

次の 2 つの関数を使用して、セッションをデータベースに書き込みます。

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))

ご覧のとおり、整数ではなく Deferred オブジェクトである createSession の sid を使用しようとしています。これが正しく、コールバックを追加するとhandleConnectionLost、この時点でクエリが実行され、ここで値を使用できるようになります。しかし、sid が必要な関数はこれだけではありません。そのため、sid が必要なときに毎回コールバックを行うと、オーバーヘッドが発生します。

  1. 関数に sid を整数として与える方法はありますか? クエリを一度実行するだけですか?どのように見える必要がありますか?
  2. now()ステートメントで Deferred クエリを使用している場合。now()このクエリをコールバックに追加したときに使用されますnow()か、それともクエリが起動されたときに使用されますか?
4

1 に答える 1

0
  1. 後で使用するために新しい行を挿入した後、すぐに ID を取得できます。同様の質問がここで回答されています。

  2. クエリが起動されたときに now() を使用します

于 2013-06-03T11:59:54.517 に答える