2013-08-14 21 views
6

'dan biraz yardım gerekiyor. Aşağıdaki sorguyu alıyorum ve bunu sqlalchemy.orm cinsinden nasıl temsil edeceğinizi merak ediyorum. Şu anda session.execute tarafından icra ediyorum. Benim için kritik değil, ama sadece merak ediyorum. Aslında bilmediğim şey, herhangi bir katılım yapmadan FROM yan tümcesine (iç içe görünüm) alt sorgunun nasıl yerleştirileceğidir. tüm verileri ayrıştırmak için en iç sorgu fonksiyonunda regexp_split_to_table başlar sınırı olmadan ve ancak bundan sonra sınırı yok -SQLAlchemy alt sorgusu, birleşim olmadan

select g_o.group_ from (
    select distinct regexp_split_to_table(g.group_name, E',') group_ 
     from (
      select array_to_string(groups, ',') group_name 
      from company 
      where status='active' 
      and array_to_string(groups, ',') like :term 
      limit :limit 
     ) g 
    ) g_o 
where g_o.group_ like :term 
order by 1 
limit :limit 

nedeniyle hız sorunu bu alt sorgu şeyi gerekir. Ama masam kocaman ve bunu karşılayamam. bir şey çok açık değilse

, isteyin, ben

cevap

8

Bu PostgreSQL olduğunu tahmin) elimden geleni yapacağım.

Bir alt sorgu oluşturmak için subquery() yöntemini kullanın. Elde edilen nesne, Table nesnesiymiş gibi kullanılabilir. İşte sorgu sqlalchemy nasıl görüneceğini nasıl: Ancak

subq1 = session.query(
    func.array_to_string(Company.groups, ',').label('group_name') 
).filter(
    (Company.status == 'active') & 
    (func.array_to_string(Company.groups, ',').like(term)) 
).limit(limit).subquery() 

subq2 = session.query(
    func.regexp_split_to_table(subq1.c.group_name, ',') 
     .distinct() 
     .label('group') 
).subquery() 

q = session.query(subq2.c.group).\ 
    filter(subq2.c.group.like(term)).\ 
    order_by(subq2.c.group).\ 
    limit(limit) 

, sen regexp_split_to_table ile bölme sonra unnest işlevini kullanarak yerine arrayt_to_string ile dizeye diziyi dönüştürme ve tek alt sorgu önlemek olabilir:

subq = session.query(
    func.unnest(Company.groups).label('group') 
).filter(
    (Company.status == 'active') & 
    (func.array_to_string(Company.groups, ',').like(term)) 
).limit(limit).subquery() 

q = session.query(subq.c.group.distinct()).\ 
    filter(subq.c.group.like(term)).\ 
    order_by(subq.c.group).\ 
    limit(limit)