Browse Source

flask: Use baked query

Baked query is introduced in SQLAlchemy 1.0.
http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html

/db?quries=20: 140 req/sec => 220 req/sec on MBP (Core i5 2.6GHz)
INADA Naoki 10 years ago
parent
commit
08a150daaf
1 changed files with 11 additions and 3 deletions
  1. 11 3
      frameworks/Python/flask/app.py

+ 11 - 3
frameworks/Python/flask/app.py

@@ -10,6 +10,7 @@ import flask
 from flask import Flask, request, render_template, make_response, jsonify
 from flask import Flask, request, render_template, make_response, jsonify
 from flask.ext.sqlalchemy import SQLAlchemy
 from flask.ext.sqlalchemy import SQLAlchemy
 from sqlalchemy import create_engine
 from sqlalchemy import create_engine
+from sqlalchemy.ext import baked
 
 
 if sys.version_info[0] == 3:
 if sys.version_info[0] == 3:
     xrange = range
     xrange = range
@@ -31,6 +32,8 @@ app.config['JSONIFY_PRETTYPRINT_REGULAR'] = False
 db = SQLAlchemy(app)
 db = SQLAlchemy(app)
 dbraw_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], connect_args={'autocommit': True}, pool_reset_on_return=None)
 dbraw_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], connect_args={'autocommit': True}, pool_reset_on_return=None)
 
 
+bakery = baked.bakery()
+
 
 
 # models
 # models
 
 
@@ -48,6 +51,11 @@ class World(db.Model):
             'randomNumber': self.randomNumber
             'randomNumber': self.randomNumber
         }
         }
 
 
+    @staticmethod
+    def get(ident):
+        baked_query = bakery(lambda s: s.query(World))
+        return baked_query(db.session()).get(ident)
+
 
 
 class Fortune(db.Model):
 class Fortune(db.Model):
     __tablename__ = "Fortune"
     __tablename__ = "Fortune"
@@ -77,7 +85,7 @@ def get_random_world():
         num_queries = 1
         num_queries = 1
     if num_queries > 500:
     if num_queries > 500:
         num_queries = 500
         num_queries = 500
-    worlds = [World.query.get(randint(1, 10000)).serialize
+    worlds = [World.get(randint(1, 10000)).serialize
               for _ in xrange(num_queries)]
               for _ in xrange(num_queries)]
     return json_response(worlds)
     return json_response(worlds)
 
 
@@ -85,7 +93,7 @@ def get_random_world():
 @app.route("/dbs")
 @app.route("/dbs")
 def get_random_world_single():
 def get_random_world_single():
     wid = randint(1, 10000)
     wid = randint(1, 10000)
-    worlds = World.query.get(wid).serialize
+    worlds = World.get(wid).serialize
     return json_response(worlds)
     return json_response(worlds)
 
 
 
 
@@ -146,7 +154,7 @@ def updates():
     ids = [rp() for _ in xrange(num_queries)]
     ids = [rp() for _ in xrange(num_queries)]
     ids.sort()  # To avoid deadlock
     ids.sort()  # To avoid deadlock
     for id in ids:
     for id in ids:
-        world = World.query.get(id)
+        world = World.get(id)
         world.randomNumber = rp()
         world.randomNumber = rp()
         worlds.append(world.serialize)
         worlds.append(world.serialize)
     res = json_response(worlds)
     res = json_response(worlds)