views.py 4.8 KB

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