【问题标题】:raw SQL to sqlalchemy syntax原始 SQL 到 sqlalchemy 语法
【发布时间】:2017-04-20 04:55:16
【问题描述】:

我正在使用 sqlaclhemy 在我的 python 项目中查询我的数据库,我对 sqlalchemy 还很陌生,但是就像目前的概念一样,我正在做一些非常简单的事情,例如,

sel = select([staff.c.name]) \
    .select_from(staff) \
    .where(staff.c.workbase != "") \
    .where((staff.c.status != 'Left') & (staff.c.status != 'Name Changed'))

我的部分项目需要更复杂的sql查询,但我想保留在sqlalchemy中,我的原始sql长这样,

    SELECT A.a_allowance, B.b_allowance, C.c_allowance, A.name, A.leave_allowance
FROM
    (SELECT ROUND(leave_allowance * 0.32, 2) as a_allowance, name, leave_allowance FROM staff_list) A
    INNER JOIN
    (SELECT ROUND(leave_allowance * 0.40, 2) as b_allowance, name FROM staff_list) B
    ON A.name = B.name
    INNER JOIN
    (SELECT ROUND(leave_allowance * 0.28, 2) as c_allowance, name FROM staff_list) C
    ON A.name = C.name
    WHERE A.name = 'Jones Jones';

我不确定如何在 sqlalchemy 中进行嵌套选择等。

【问题讨论】:

    标签: python mysql sql-server sqlalchemy


    【解决方案1】:

    您可以使用.join() 生成连接:

    >>> print(foo.join(bar, foo.c.bar_id == bar.c.id))
    foo JOIN bar ON foo.bar_id = bar.id
    

    您可以用子查询替换表达式中的表名:

    >>> left = select([foo.c.bar_id]).select_from(foo).where(foo.c.baz > 0).alias("left")
    >>> print(left.join(bar, left.c.bar_id == bar.c.id))
    (SELECT foo.bar_id AS bar_id 
    FROM foo 
    WHERE foo.baz > :baz_1) AS "left" JOIN bar ON "left".bar_id = bar.id
    

    在大多数情况下,子查询的行为与表完全一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多