将SQL引用父子句转换为SQLAlchemy

时间:2013-10-23 01:12:28

标签: python sql sqlalchemy flask-sqlalchemy

我基本上试图让这个SQL查询在SQLAlchemy中运行:

SELECT p.id, (SELECT COUNT(*) FROM response r WHERE <conditions on r> AND r.prompt_id = p.id)
  FROM prompt p WHERE p.<conditions>;

除了在子查询中对p.id的引用外,我已经完成了所有工作:

# used all over application
def filter_prompt(search_string, customer_id, state):
  prompts = Prompt.query
  if search_string:
    prompts = prompts.filter(Prompt.id.ilike('%' + search_string + '%'))
  elif customer_id, state, etc
    ... more filtering ...
  return prompts

我有一个特殊情况,我需要返回相关对象的数量,所以我试图只添加一个子查询列:

prompts = filter_prompt(...)
count_subquery = session.query(func.count('response')).filter(Response.validated_at>=date, Response.prompt_id == Prompt.id).subquery()
prompts_with_response_count = prompts.add_column(count_subquery)

问题是Prompt.id未正确解析为该行的id。我如何正确地将上述SQL转换为SQLAlchemy?

1 个答案:

答案 0 :(得分:1)

如果在select语句中使用子查询,则不执行subquery but instead do as_scalar`(告诉SQLAlchemy将会有标量结果,一行,一列):

count_subquery = session.query(func.count('response')).filter(Response.validated_at>=date, Response.prompt_id == Prompt.id).as_scalar()