views.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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, World
  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['db_session']() as sess:
  31. # TODO(SA1.4.0b2): sess.scalar()
  32. ret = await sess.execute(select(World.randomnumber).filter_by(id=id_))
  33. num = ret.scalar()
  34. return json_response({'id': id_, 'randomNumber': num})
  35. async def single_database_query_raw(request):
  36. """
  37. Test 2 RAW
  38. """
  39. id_ = randint(1, 10000)
  40. async with request.app['pg'].acquire() as conn:
  41. r = await conn.fetchval('SELECT id,randomnumber FROM world WHERE id = $1', id_)
  42. return json_response({'id': id_, 'randomNumber': r})
  43. async def multiple_database_queries_orm(request):
  44. """
  45. Test 3 ORM
  46. """
  47. num_queries = get_num_queries(request)
  48. ids = [randint(1, 10000) for _ in range(num_queries)]
  49. ids.sort()
  50. result = []
  51. async with request.app['db_session']() as sess:
  52. for id_ in ids:
  53. # TODO(SA1.4.0b2): sess.scalar()
  54. ret = await sess.execute(select(World.randomnumber).filter_by(id=id_))
  55. num = ret.scalar()
  56. result.append({'id': id_, 'randomNumber': num})
  57. return json_response(result)
  58. async def multiple_database_queries_raw(request):
  59. """
  60. Test 3 RAW
  61. """
  62. num_queries = get_num_queries(request)
  63. ids = [randint(1, 10000) for _ in range(num_queries)]
  64. ids.sort()
  65. result = []
  66. async with request.app['pg'].acquire() as conn:
  67. stmt = await conn.prepare('SELECT id,randomnumber FROM world WHERE id = $1')
  68. for id_ in ids:
  69. result.append({
  70. 'id': id_,
  71. 'randomNumber': await stmt.fetchval(id_),
  72. })
  73. return json_response(result)
  74. @template('fortune.jinja')
  75. async def fortunes(request):
  76. """
  77. Test 4 ORM
  78. """
  79. async with request.app['db_session']() as sess:
  80. ret = await sess.execute(select(Fortune.id, Fortune.message))
  81. fortunes = ret.all()
  82. fortunes.append(Fortune(id=0, message='Additional fortune added at request time.'))
  83. fortunes.sort(key=attrgetter('message'))
  84. return {'fortunes': fortunes}
  85. @template('fortune.jinja')
  86. async def fortunes_raw(request):
  87. """
  88. Test 4 RAW
  89. """
  90. async with request.app['pg'].acquire() as conn:
  91. fortunes = await conn.fetch('SELECT * FROM Fortune')
  92. fortunes.append(dict(id=0, message='Additional fortune added at request time.'))
  93. fortunes.sort(key=itemgetter('message'))
  94. return {'fortunes': fortunes}
  95. async def updates(request):
  96. """
  97. Test 5 ORM
  98. """
  99. num_queries = get_num_queries(request)
  100. result = []
  101. ids = [randint(1, 10000) for _ in range(num_queries)]
  102. ids.sort()
  103. # TODO(SA1.4.0b2): async with request.app['db_session'].begin() as sess:
  104. async with request.app['db_session']() as sess:
  105. async with sess.begin():
  106. for id_ in ids:
  107. rand_new = randint(1, 10000)
  108. # TODO(SA1.4.0b2): world = await sess.get(World, id_)
  109. ret = await sess.execute(select(World).filter_by(id=id_))
  110. world = ret.scalar()
  111. world.randomnumber = rand_new
  112. result.append({'id': id_, 'randomNumber': rand_new})
  113. return json_response(result)
  114. async def updates_raw(request):
  115. """
  116. Test 5 RAW
  117. """
  118. num_queries = get_num_queries(request)
  119. ids = [randint(1, 10000) for _ in range(num_queries)]
  120. ids.sort()
  121. result = []
  122. updates = []
  123. async with request.app['pg'].acquire() as conn:
  124. stmt = await conn.prepare('SELECT id,randomnumber FROM world WHERE id = $1')
  125. for id_ in ids:
  126. # the result of this is the int previous random number which we don't actually use
  127. await stmt.fetchval(id_)
  128. rand_new = randint(1, 10000)
  129. result.append({'id': id_, 'randomNumber': rand_new})
  130. updates.append((rand_new, id_))
  131. await conn.executemany('UPDATE world SET randomnumber=$1 WHERE id=$2', updates)
  132. return json_response(result)
  133. async def plaintext(request):
  134. """
  135. Test 6
  136. """
  137. return Response(body=b'Hello, World!', content_type='text/plain')