Ich benutze RethinkDB
mit Tornado
mit einem asynchronen Ansatz. Basiert auf meinem Datenmodell in RethinkDB
, nachdem ich einen Datensatz für meine topic
Tabelle eingefügt habe, muss ich auch einen neuen Datensatz in user_to_topic
Tabelle aktualisieren/einfügen. Hier ist die grundlegende Einrichtung meines Post-Request-Handlers.Wie man einen Wert aus der tornado.ioloop.IOLoop Instanz zurückgibt add_future Methode
class TopicHandler(tornado.web.RequestHandler):
def get(self):
pass
@gen.coroutine
def post(self, *args, **kwargs):
# to establish databse connection
connection = rth.connect(host='localhost', port=00000, db=DATABASE_NAME)
# Thread the connection
threaded_conn = yield connection
title = self.get_body_argument('topic_title')
# insert into table
new_topic_record = rth.table('Topic').insert({
'title': topic_title,
}, conflict="error",
durability="hard").run(threaded_conn)
# {TODO} for now assume the result is always written successfully
io_loop = ioloop.IOLoop.instance()
# I want to return my generated_keys here
io_loop.add_future(new_topic_record, self.return_written_record_id)
# do stuff with the generated_keys here, how do I get those keys
def return_written_record_id(self, f):
_result = f.result()
return _result['generated_keys']
nachdem der Einfügevorgang abgeschlossen ist, das Objekt mit Future
Rückergebnis von RethinkDB
Einfügevorgang durch Future.result()
Verfahren, das I-ID des neuen Datensatzes unter Verwendung von generated_keys
Attribut Ergebnis abrufen kann. Entsprechend Tornado
document kann ich Sachen mit dem Ergebnis in meiner Rückruffunktion, return_written_record_id
tun. Natürlich kann ich alle anderen Datenbankoperationen innerhalb meiner return_written_record_id
Funktion tun, aber ist es möglich, alle Ids zu meiner post
Funktion zurückzugeben? Oder muss man Coroutine im Tornado benutzen?
Jeder Vorschlag wird geschätzt. Vielen Dank!