Я обновил 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.
Мой вопрос состоит в том, как я могу возвратить словарь?
Это должно работа:
dict (zip (['id', 'username', 'email'], result))
(или вы можете использовать понимание словаря, если вы используете Python 3. x).
Кроме того, вам не нужно вызывать session.execute
для объекта session.query
. Вместо этого вы захотите использовать метод .one ()
. Это также устраняет необходимость в вызове .limit (1)
в конце вашего запроса.
Вы уверены, что это не ResultProxy , который выдает себя за кортеж, когда вы его печатаете? Многие объекты в ORM не являются тем, что возвращает их функция __ str __
.
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