SQLAlchemy конвертирует результат запроса SELECT в список dicts

Когда я использовал session.query, мне удалось преобразовать результат в список dicts:

my_query = session.query(table1,table2).filter(all_filters)
result_dict = [u.__dict__ for u in my_query.all()]

Но теперь, когда мне нужно работать с операцией SELECT(), как я могу преобразовать результаты в dict, который выглядит так, для каждого результата строки:

[{'Row1column1Name' : 'Row1olumn1Value', 'Row1column2Name' :'Row1Column2Value'},{'Row2column1Name' : 'Row2olumn1Value', 'Row2column2Name' : 'Row2Column2Value'},etc....].

Это мой код SELECT():

select = select([table1,table2]).where(all_filters)
res = conn.execute(select)
row = res.fetchone() #I have to use fetchone() because the query returns lots of rows
resultset=[]
while row is not None:
    row = res.fetchone()
    resultset.append(row)

print resultset

Результат:

[('value1', 'value2', 'value3', 'value4'),(.....),etc for each row]

Я новичок в Python, любая помощь будет оценена.

Ответ 1

Кажется, это объект RowProxy. Попробуйте:

row = dict(zip(row.keys(), row))

Ответ 2

Вы можете вывести каждую строку из результата выбора в виде либо dict, либо кортежа. То, что вы видели, - это поведение по умолчанию, которое должно представлять каждую строку как кортеж. Чтобы привести тип к dict, измените свой код следующим образом:

select = select([table1, table2]).where(all_filters)
res = conn.execute(select)
resultset = []
for row in res:
    resultset.append(dict(row))
print resultset

Это работает хорошо, если вам нужно обрабатывать результат по одной строке за раз.

Если вы счастливы поместить все строки в список за один раз, понимание списка немного опрятно:

select = select([table1, table2]).where(all_filters)
res = conn.execute(select)
resultset = [dict(row) for row in res]
print resultset

Ответ 3

Для первого запроса лучше использовать этот подход для sqlalchemy KeyedTuple:

# Convert an instance of `sqlalchemy.util._collections.KeyedTuple`
# to a dictionary
my_query = session.query(table1,table2).filter(all_filters)
result_dict = map(lambda q: q._asdict(), my_query)

ИЛИ

result_dict = map(lambda obj: dict(zip(obj.keys(), obj)), my_query)

Для ResultProxy, как упоминалось ранее:

result_dict = dict(zip(row.keys(), row))

Ответ 4

Основываясь на ответе Фанти, если вы используете "Понимание списка", вы можете создать список диктовок в одном ряду. Здесь results - результат моего запроса.

records = [dict(zip(row.keys(), row)) for row in results]