Sqlalchemy вставить запрос не возвращает результаты - PullRequest
0 голосов

Я попытался выбрать возвращаемые значения из запроса вставки:

HOST_INSERT_QUERY = (
    Host.__table__.insert()
        .values(
            name=bindparam("name"),
            source=bindparam("source"),
            type=bindparam("type")
                )
        .returning(Host.__table__.c.id)
)
result = db_conn.execute(HOST_INSERT_QUERY, values)

Что я вижу из db.echo:

info sqlalchemy.engine.base.Engine INSERT INTO hosts (name, source, type) VALUES ( %(name)s, %(source)s, %(type)s) RETURNING hosts.id
info sqlalchemy.engine.base.Engine ({ 'name': 'hhh', 'source': '["import"]', 'type': 'host'},{...})
debug:  Added 2 hosts

Это действительно работает. Хозяева вставляют в базу данных, но я вижу некоторые проблемы в отладчике; Результат (ResultProxy) имеет:

rowcount = 2 #right!
is_insert = True #right!
return_rows=False #WHYYYY????????

Если я попытаюсь:

result.fetсhall()

AttributeError: 'ResultProxy' object has no attribute 'fetсhall'

Версия:

  • SQLAlchemy 1.3.1
  • psycopg-binary 2.7.7

Внимание! Этот код работает только при вставке одной записи. При вставке нескольких строк невозможно извлечь значения из ВОЗВРАТА.

1 Ответ

1 голос
/ 26 марта 2019

Вы не можете получить результаты от executemany, который SQLAlchemy использует внизу, если вы передаете набор из более чем 1 строки для вставки.Вот почему вы наблюдаете return_rows=False.Обходной путь - «встроить» строки, используя одно выражение multi VALUES, вместо использования bindparams и executemany:

HOST_INSERT_QUERY = (
    Host.__table__.insert()
        .values(values)
        .returning(Host.__table__.c.id)
)

result = db_conn.execute(HOST_INSERT_QUERY)

. Это выполняется как один оператор "множественных значений" и, таким образом, избегает использования executemany и может возвращать результаты.Обратите внимание, что порядок возвращенных идентификаторов может не совпадать с порядком вставленных строк.

...