私はツイスト ベースのネットワーク アプリケーションを持っています。今、新しいデータベース設計を実装したいと思っていますが、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 が必要なときに毎回コールバックを行うと、オーバーヘッドが発生します。
- 関数に sid を整数として与える方法はありますか? クエリを一度実行するだけですか?どのように見える必要がありますか?
now()
ステートメントで Deferred クエリを使用している場合。now()
このクエリをコールバックに追加したときに使用されますnow()
か、それともクエリが起動されたときに使用されますか?