Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД [RSS Feed]

#1 Окт. 11, 2019 15:17:09

AndreiVZ
Зарегистрирован: 2019-10-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД

Приветствую.
Разбираюсь с 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.

Офлайн

#2 Окт. 11, 2019 15:31:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД

давайте алиасы полям выборки

 SELECT a.id as a_id, b.id as b_id from ... 



Офлайн

#3 Окт. 11, 2019 15:54:28

AndreiVZ
Зарегистрирован: 2019-10-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД

FishHook
давайте алиасы полям выборки
Спасибо, помогло!
Еще интересно, как записать подобный запрос в таком виде:
 s = select([users.c.id, users, addresses.c.id, addresses]).select_from(users.outerjoin(addresses))

Офлайн

#4 Окт. 17, 2019 13:26:53

AndreiVZ
Зарегистрирован: 2019-10-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД

Еще вопрос: как при следующем запросе на добавление записи в таблицу, вернуть ее id? :

 conn.execute(
            se_query.insert().values(query_text=params['intitle'], date=datetime.now()).returning(id)
        )

Офлайн

  • Начало
  • » Web
  • » Разбираюсь с aiohttp + postgresql, помогите с написанием запроса к БД[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version