|
1 | 1 | from operator import attrgetter, itemgetter |
2 | 2 | from pathlib import Path |
3 | | -from random import randint |
| 3 | +from random import randint, sample |
4 | 4 |
|
5 | 5 | import jinja2 |
6 | 6 | import orjson |
7 | 7 | from aiohttp.web import Response |
8 | 8 | from sqlalchemy import select |
| 9 | +from sqlalchemy.orm.attributes import flag_modified |
9 | 10 |
|
10 | 11 | from .models import sa_fortunes, sa_worlds, Fortune, World |
11 | 12 |
|
@@ -77,7 +78,7 @@ async def multiple_database_queries_orm(request): |
77 | 78 | result = [] |
78 | 79 | async with request.app['db_session']() as sess: |
79 | 80 | for id_ in ids: |
80 | | - num = await sess.scalar(READ_SELECT_ORM.filter_by(id=id_)) |
| 81 | + num = await sess.scalar(READ_SELECT_ORM.where(World.id == id_)) |
81 | 82 | result.append({'id': id_, 'randomNumber': num}) |
82 | 83 | return json_response(result) |
83 | 84 |
|
@@ -131,30 +132,38 @@ async def updates(request): |
131 | 132 | Test 5 ORM |
132 | 133 | """ |
133 | 134 | num_queries = get_num_queries(request) |
134 | | - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)] |
135 | | - updates.sort() |
136 | | - worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] |
| 135 | + |
| 136 | + ids = sample(range(1, 10000 + 1), num_queries) |
| 137 | + ids.sort() |
| 138 | + worlds = [] |
137 | 139 |
|
138 | 140 | async with request.app['db_session'].begin() as sess: |
139 | | - for id_, number in updates: |
140 | | - world = await sess.get(World, id_, populate_existing=True) |
141 | | - world.randomnumber = number |
| 141 | + for row_id in ids: |
| 142 | + random_number = randint(1, 10000) |
| 143 | + world = await sess.get(World, row_id, populate_existing=True) |
| 144 | + world.randomnumber = random_number |
| 145 | + # force sqlalchemy to UPDATE entry even if the value has not changed |
| 146 | + # doesn't make sense in a real application, added only for pass `tfb verify` |
| 147 | + flag_modified(world, "randomnumber") |
| 148 | + worlds.append({'id': row_id, 'randomNumber': random_number}) |
| 149 | + |
142 | 150 | return json_response(worlds) |
143 | 151 |
|
144 | 152 | async def updates_raw(request): |
145 | 153 | """ |
146 | 154 | Test 5 RAW |
147 | 155 | """ |
148 | 156 | num_queries = get_num_queries(request) |
149 | | - updates = [(randint(1, 10000), randint(1, 10000)) for _ in range(num_queries)] |
150 | | - updates.sort() |
| 157 | + ids = sample(range(1, 10000 + 1), num_queries) |
| 158 | + ids.sort() |
| 159 | + updates = [(row_id, randint(1, 10000)) for row_id in ids] |
151 | 160 | worlds = [{'id': row_id, 'randomNumber': number} for row_id, number in updates] |
152 | 161 |
|
153 | 162 | async with request.app['pg'].acquire() as conn: |
154 | 163 | stmt = await conn.prepare(READ_ROW_SQL) |
155 | | - for id_, _ in updates: |
| 164 | + for row_id in ids: |
156 | 165 | # the result of this is the int previous random number which we don't actually use |
157 | | - await stmt.fetchval(id_) |
| 166 | + await stmt.fetchval(row_id) |
158 | 167 | await conn.executemany(WRITE_ROW_SQL, updates) |
159 | 168 |
|
160 | 169 | return json_response(worlds) |
|
0 commit comments