简体   繁体   English

原始SQL到sqlalchemy语法

[英]raw SQL to sqlalchemy syntax

I am using sqlaclhemy to query my database in my python project, I am fairly new to sqlalchemy, but like the concept at the moment, I am doing quite simple things like, 我正在使用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'))

Part of my project requires a more complex sql query, but I want to keep it in sqlalchemy, my raw sql looks like this, 我的项目的一部分需要更复杂的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';

I not sure how to do the nested selects etc in sqlalchemy. 我不确定如何在sqlalchemy中进行嵌套选择等。

You can produce a join by using .join() : 您可以使用.join()生成.join()

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

You can replace the table names in the expression by subqueries: 您可以用子查询替换表达式中的表名:

>>> 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

For the most part, subqueries act exactly like tables. 在大多数情况下,子查询的行为与表完全相同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM