2016-03-16 2 views
1

Если у меня есть:Доступ присоединиться к результатам запроса в SQLAlchemy

query = db.session.query(Food, Person).filter(Food.id == Person.favourite_food) 
for row in db.session.execute(query) 
    print row 

Выход для печати первой страницы я получаю это:

(1, u'Alice', 25, u'F', u'z', None, False, 1, u'icecream', 1, None, False) 
(5, u'Bob', 38, u'M', u'z', None, False, 3, u'pizza', 1, None, False) 

Как сделать:

print row.name, row.gender # <-- how do I do this? 

Результат похоже, больше нет имен столбцов.

Edit: А также есть способ сериализации результатов запроса с помощью всего одной линии, что-то вроде

return Response(json.dumps(query.results), mimetype='application/json') 

ответ

0

Вы можете выполнить ваш запрос по-разному:

for row in query.all(): 
    print row[1].name, row[1].gender 
+0

Спасибо. Есть ли способ сериализации результатов запроса только с одной строкой, что-то вроде return Response (json.dumps (query.results), mimetype = 'application/json') – Digital

+0

Вы имеете в виду: 'answer = [(row [1]. name, row [1] .gender) для строки в query.all()] ' – API

2

При указании

query(Food, Person) 

результирующие строки будут иметь тип sqlalchemy.util._collections.result, , и она будет иметь два поля: Продукты питания и Person

часть еды можно ссылаться либо по строке [0] или row.Food Человек часть может ссылаться либо по строке [1] или row.Person

так, например,

print(row.Person.name, row.Person.gender) # works 
    print(row[1].name, row[1].gender) # also works 

, если вы хотите только определенные поля, вы можете указать их в запросе, например:

query = (db.session.query(Person.name, Person.gender, Food.name.label('foodname')) 
      .filter(Food.id == Person.favourite_food)) 

и тогда объект будет иметь 3 поля: имя, пол, foodname

print(row.name, row.gender, row.foodname) 
Смежные вопросы