Найти - Пользователи
Полная версия: Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД
Начало » Web » Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД
1
AndreiVZ
Приветствую.
Разбираюсь с aiohttp в связке postgres. Уровень - начинающий разработчик, ранее, для веб писал только пару приложений на django с целью обучения.
Нужно сделать выборку из двух таблиц связанных многие ко многим через третью таблицу. В терминале postgres запрос следующего вида отрабатывает нормально:
 SELECT se_query.query_text, se_query.date, answer.header, answer.date FROM se_query INNER JOIN (answer INNER JOIN query_answer ON answer.id = query_answer.answer_id) ON se_query.id = query_answer.query_id ORDER BY se_query.date

Как правильно его записать во views? Пробывал так же:
 @aiohttp_jinja2.template('index.html')
async def index(request):
    async with request.app['db'].acquire() as conn:
        cursor = await conn.execute(
            'SELECT se_query.query_text, se_query.date, answer.header, answer.date FROM se_query ' +
            'INNER JOIN (answer INNER JOIN query_answer ON answer.id = query_answer.answer_id) ' +
            'ON se_query.id = query_answer.query_id ORDER BY se_query.date'
        )
        records = await cursor.fetchall()
        se_queries = [dict(q) for q in records]
        return {'queries': se_queries}

Не работает. Как понимаю, не нравятся одинаковые поля date из разных таблиц. Но вообще бы хотелось узнать, как правильнее и эффективнее оформлять такие запросы в aiohttp. В сети примеры слишком простые.

 ERROR: aiohttp.server:Error handling request
Traceback (most recent call last):
  File "/home/parallels/PycharmProjects/se_ask/venv/lib/python3.7/site-packages/aiohttp/web_protocol.py", line 418, in start
    resp = await task
  File "/home/parallels/PycharmProjects/se_ask/venv/lib/python3.7/site-packages/aiohttp/web_app.py", line 458, in _handle
    resp = await handler(request)
  File "/home/parallels/PycharmProjects/se_ask/venv/lib/python3.7/site-packages/aiohttp/web_middlewares.py", line 119, in impl
    return await handler(request)
  File "/home/parallels/PycharmProjects/se_ask/venv/se_app/middlewares.py", line 20, in error_middleware
    response = await handler(request)
  File "/home/parallels/PycharmProjects/se_ask/venv/lib/python3.7/site-packages/aiohttp_jinja2/__init__.py", line 91, in wrapped
    context = await coro(*args)
  File "/home/parallels/PycharmProjects/se_ask/venv/se_app/views.py", line 23, in index
    se_queries = [dict(q) for q in records]
  File "/home/parallels/PycharmProjects/se_ask/venv/se_app/views.py", line 23, in <listcomp>
    se_queries = [dict(q) for q in records]
  File "/home/parallels/PycharmProjects/se_ask/venv/lib/python3.7/site-packages/aiopg/sa/result.py", line 46, in __getitem__
    "try 'use_labels' option on select statement." % key)
aiopg.sa.exc.InvalidRequestError: Ambiguous column name 'date' in result set! try 'use_labels' option on select statement.
FishHook
давайте алиасы полям выборки
 SELECT a.id as a_id, b.id as b_id from ... 
AndreiVZ
FishHook
давайте алиасы полям выборки
Спасибо, помогло!
Еще интересно, как записать подобный запрос в таком виде:
 s = select([users.c.id, users, addresses.c.id, addresses]).select_from(users.outerjoin(addresses))

AndreiVZ
Еще вопрос: как при следующем запросе на добавление записи в таблицу, вернуть ее id? :
 conn.execute(
            se_query.insert().values(query_text=params['intitle'], date=datetime.now()).returning(id)
        )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB