sqlalchemy table.update.returning возвращает только одно значение вместо нескольких на postgresql - PullRequest
0 голосов
/ 04 августа 2020

Я использую postgresql и sqlalchemy, чтобы обновить таблицу и затем вернуть несколько значений с помощью returning:

async def update_monitor(id: int, payload: MonitorIn) -> Dict[str, Any]:
    
    utc_now = to_utc(datetime.now())
    query = (
        MONITOR
            .update()
            .where(id == MONITOR.c.id)
            .values(**payload.dict(), updated=utc_now)
            .returning(MONITOR.c.id,
                       MONITOR.c.watchlist_id,
                       MONITOR.c.term,
                       MONITOR.c.match_substring_variations,
                       MONITOR.c.nameserver_exclusions,
                       MONITOR.c.text_exclusions,
                       MONITOR.c.created,
                       MONITOR.c.updated)
    )
    result = await PRIMARY.execute(query=query)
    return {'id': result[0],
            'watchlist_id': result[1],
            'term': result[2],
            'match_substring_variations': result[3],
            'nameserver_exclusions': result[4],
            'text_exclusions': result[5],
            'created': result[6],
            'updated': result[7]}

PRIMARY - это postgresql db .

import databases
PRIMARY = databases.Database(config.DB_URL)

однако результатом будет int, который соответствует MONITOR.c.id, которое является первым возвращаемым значением, поэтому похоже, что метод returning возвращает только одно (первое) значение вместо несколько значений. Я действительно надеюсь получить несколько значений. и согласно this он должен поддерживать несколько возвращаемых значений. что здесь не так?

1 Ответ

1 голос
/ 04 августа 2020

Похоже, что databases библиотека execute() возвращает Cursor.lastrowid, и если вы хотите получить строку (строки) , используйте fetch_one() / fetch_all() / iterate() вместо этого.

Обратите внимание, что это не поведение SQLAlchemy и returning(), как указано в заголовке этого вопроса, а databases, который просто использует SQLAlchemy Core DSL как способ определения запросов. Затем он компилирует их в текст и использует свой собственный пул соединений и используемый драйвер asyn c для передачи оператора в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...