SQLAlchemy возвращает кортеж не словарь

Я обновил SQLAlchemy к 0,6, но он повредил все. Я заметил, что это возвращает кортеж не словарь больше. Вот демонстрационный запрос:

query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1)
result = session.execute(query).fetchone()

Эта часть кода раньше возвращала словарь в 0,5.

Мой вопрос состоит в том, как я могу возвратить словарь?

9
задан Ivan 13 May 2010 в 15:54
поделиться

3 ответа

Это должно работа: dict (zip (['id', 'username', 'email'], result)) (или вы можете использовать понимание словаря, если вы используете Python 3. x).
Кроме того, вам не нужно вызывать session.execute для объекта session.query . Вместо этого вы захотите использовать метод .one () . Это также устраняет необходимость в вызове .limit (1) в конце вашего запроса.

7
ответ дан 4 December 2019 в 06:00
поделиться

Вы уверены, что это не ResultProxy , который выдает себя за кортеж, когда вы его печатаете? Многие объекты в ORM не являются тем, что возвращает их функция __ str __ .

10
ответ дан 4 December 2019 в 06:00
поделиться

session.execute никогда не возвращал dict, он возвращает объект RowProxy, который может быть проиндексирован как dict с использованием целочисленных ключей для позиционного поиска, строковых ключей для поиска на основе меток или объектов Column для найдите значение этого столбца. Проблема здесь в том, что session.execute (query) не выполняет то, что вы от него ожидаете. Он преобразует объект Query в оператор Select, выполняет его и напрямую возвращает результат. Набор результатов ничего не знает о функциях уровня ORM. Что изменилось между 0,5 и 0,6, так это то, что ORM использует другой алгоритм для маркировки столбцов в запросах, теперь он добавляет имя таблицы к метке. Поэтому, когда раньше row ['id'] работало, теперь row ['users_id'] работает. В обоих случаях строка [User .__ table __. Columns ['id']] работает.

Для выполнения запросов ORM вы должны фактически использовать методы .all () , .first () и .one () либо перебирать их, либо с использованием числовой индексации. Запрос возвращает именованные объекты кортежа. Заархивируйте кортеж с его ключами, если вам нужен словарь:

row = session.query(User.id, User.username, User.email)\
    .filter(and_(User.id == id, User.username == username)).first()
print("id=%s username=%s email=%s" % row) # positional
print(row.id, row.username) # by label
print(dict(zip(row.keys(), row))) # as a dict
36
ответ дан 4 December 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: