views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. from functools import partial
  2. from operator import attrgetter, itemgetter
  3. from random import randint
  4. from aiohttp_jinja2 import template
  5. from aiohttp.web import Response, json_response
  6. import ujson
  7. from sqlalchemy import select
  8. from .models import sa_fortunes, sa_worlds, Fortune
  9. json_response = partial(json_response, dumps=ujson.dumps)
  10. def get_num_queries(request):
  11. try:
  12. num_queries = int(request.match_info.get('queries', 1))
  13. except ValueError:
  14. return 1
  15. if num_queries < 1:
  16. return 1
  17. if num_queries > 500:
  18. return 500
  19. return num_queries
  20. async def json(request):
  21. """
  22. Test 1
  23. """
  24. return json_response({'message': 'Hello, World!'})
  25. async def single_database_query_orm(request):
  26. """
  27. Test 2 ORM
  28. """
  29. id_ = randint(1, 10000)
  30. async with request.app['pg'].acquire() as conn:
  31. cur = await conn.execute(select([sa_worlds.c.randomnumber]).where(sa_worlds.c.id == id_))
  32. r = await cur.first()
  33. return json_response({'id': id_, 'randomNumber': r[0]})
  34. async def single_database_query_raw(request):
  35. """
  36. Test 2 RAW
  37. """
  38. id_ = randint(1, 10000)
  39. async with request.app['pg'].acquire() as conn:
  40. r = await conn.fetchval('SELECT id,randomnumber FROM world WHERE id = $1', id_)
  41. return json_response({'id': id_, 'randomNumber': r})
  42. async def multiple_database_queries_orm(request):
  43. """
  44. Test 3 ORM
  45. """
  46. num_queries = get_num_queries(request)
  47. ids = [randint(1, 10000) for _ in range(num_queries)]
  48. ids.sort()
  49. result = []
  50. async with request.app['pg'].acquire() as conn:
  51. for id_ in ids:
  52. cur = await conn.execute(select([sa_worlds.c.randomnumber]).where(sa_worlds.c.id == id_))
  53. r = await cur.first()
  54. result.append({'id': id_, 'randomNumber': r[0]})
  55. return json_response(result)
  56. async def multiple_database_queries_raw(request):
  57. """
  58. Test 3 RAW
  59. """
  60. num_queries = get_num_queries(request)
  61. ids = [randint(1, 10000) for _ in range(num_queries)]
  62. ids.sort()
  63. result = []
  64. async with request.app['pg'].acquire() as conn:
  65. stmt = await conn.prepare('SELECT id,randomnumber FROM world WHERE id = $1')
  66. for id_ in ids:
  67. result.append({
  68. 'id': id_,
  69. 'randomNumber': await stmt.fetchval(id_),
  70. })
  71. return json_response(result)
  72. @template('fortune.jinja')
  73. async def fortunes(request):
  74. """
  75. Test 4 ORM
  76. """
  77. async with request.app['pg'].acquire() as conn:
  78. cur = await conn.execute(select([sa_fortunes.c.id, sa_fortunes.c.message]))
  79. fortunes = list(await cur.fetchall())
  80. fortunes.append(Fortune(id=0, message='Additional fortune added at request time.'))
  81. fortunes.sort(key=attrgetter('message'))
  82. return {'fortunes': fortunes}
  83. @template('fortune.jinja')
  84. async def fortunes_raw(request):
  85. """
  86. Test 4 RAW
  87. """
  88. async with request.app['pg'].acquire() as conn:
  89. fortunes = await conn.fetch('SELECT * FROM Fortune')
  90. fortunes.append(dict(id=0, message='Additional fortune added at request time.'))
  91. fortunes.sort(key=itemgetter('message'))
  92. return {'fortunes': fortunes}
  93. async def updates(request):
  94. """
  95. Test 5 ORM
  96. """
  97. num_queries = get_num_queries(request)
  98. result = []
  99. ids = [randint(1, 10000) for _ in range(num_queries)]
  100. ids.sort()
  101. async with request.app['pg'].acquire() as conn:
  102. for id_ in ids:
  103. cur = await conn.execute(
  104. select([sa_worlds.c.randomnumber])
  105. .where(sa_worlds.c.id == id_)
  106. )
  107. # the result of this is a dict with the previous random number `randomnumber` which we don't actually use
  108. await cur.first()
  109. rand_new = randint(1, 10000)
  110. await conn.execute(
  111. sa_worlds.update()
  112. .where(sa_worlds.c.id == id_)
  113. .values(randomnumber=rand_new)
  114. )
  115. result.append({'id': id_, 'randomNumber': rand_new})
  116. return json_response(result)
  117. async def updates_raw(request):
  118. """
  119. Test 5 RAW
  120. """
  121. num_queries = get_num_queries(request)
  122. ids = [randint(1, 10000) for _ in range(num_queries)]
  123. ids.sort()
  124. result = []
  125. updates = []
  126. async with request.app['pg'].acquire() as conn:
  127. stmt = await conn.prepare('SELECT id,randomnumber FROM world WHERE id = $1')
  128. for id_ in ids:
  129. # the result of this is the int previous random number which we don't actually use
  130. await stmt.fetchval(id_)
  131. rand_new = randint(1, 10000)
  132. result.append({'id': id_, 'randomNumber': rand_new})
  133. updates.append((rand_new, id_))
  134. await conn.executemany('UPDATE world SET randomnumber=$1 WHERE id=$2', updates)
  135. return json_response(result)
  136. async def plaintext(request):
  137. """
  138. Test 6
  139. """
  140. return Response(body=b'Hello, World!', content_type='text/plain')