2015-06-19 11 views
5

ciao im cercando di raggiungere questa query crudo con sqlalchemy:da SQL prima al pallone-sqlalchemy

SELECT m.*, SUM(case when f.monkey = m.id then 1 else 0 end) as friends 
FROM monkey as m 
LEFT JOIN friendship as f ON m.id = f.monkey 
GROUP BY m.id, m.name 
order by friends desc 

finora ottengo il risultato che voglio con questa query grezzo ma voglio essere in grado di .paginate loro così ho potuto continuare a lavorare correttamente

con le mie altre query quello che ho fatto è stato questo:

monkeys = models.Monkey.query.order_by(models.Monkey.name).paginate(page, 5, False) 

abbastanza semplice e ho ottenuto quello che volevo, I belive devo fare qualcosa di simile

monkeys = models.Monkey.query.join(models.Friendship, db.func.count(models.Monkey.id == models.Friendship.monkey)) 

ma im non ottenere quello che voglio, lo so im manca la parte sum(), ma ho provato con func.c.count(), ma io non basta sapere come farlo funzionare, è posible per raggiungere questo in sqlalchemy? im utilizzando Postgres btw

risposta

0

Sembra che questo porterà a compimento ciò che è necessario

monkeys = models.Monkey.query.outerjoin(models.Friendship, db.func.count(models.Monkey.id == models.Friendship.monkey)) 

#or if you really want to stick to your above query 

monkeys = models.Monkey.query.outerjoin(models.Friendship, db.func.SUM(func.IF(models.Monkey.id == models.Friendship.monkey, 1, 0))) 

FYI io sono abituato a fare questo in MySQL, il func. * si chiama il mio essere leggermente diversa

+0

In realtà lo fa , dal momento che ho chiesto di fare una ricerca e mi mancava il func.IF come hai fatto tu, grazie! – AbdulHamid