如何在SQLAlchemy ORM中同时过滤多列中的位置

时间:2018-05-09 04:15:21

标签: python sql sqlalchemy

我有一个包含<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" style="@android:style/Widget.DeviceDefault.Light.ScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:fillViewport="false" android:scrollbarStyle="outsideOverlay" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.scanqr_android.ScrollingActivity" tools:showIn="@layout/activity_scrolling"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:background="#3f51b5" android:gravity="center_vertical" android:paddingLeft="10dp" android:text="MY PAGE TITLE" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#fff" /> <TextView android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Caterpillars turn into butterflies." tools:text="Caterpillars turn into butterflies." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> <TextView android:id="@+id/textView9" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Bubble gum contains rubber." tools:text="Bubble gum contains rubber." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> <TextView android:id="@+id/textView10" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="The deadliest earthquake of 2017 took place in Iran and Iraq." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/Button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> <TextView android:id="@+id/textView11" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Electrons are larger than molecules." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> <TextView android:id="@+id/textView12" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Thunderstorms have particular sound frequencies that can hurt a dog’s ears." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button13" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button14" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> <TextView android:id="@+id/textView13" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" There are 30 days in May." /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/button15" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="true" /> <Button android:id="@+id/button16" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="false" /> </LinearLayout> </LinearLayout> </ScrollView> </RelativeLayout> entities列的表name,并希望查找多行来测试这两列的对。在纯SQL中,我可以使用:

entity_type

在SQLAlchemy ORM中,将WHERE IN过滤到单个列表中非常简单:

SELECT *
FROM entities
WHERE (name, entity_type) IN (('abc', 'type1'), ('def', 'type2'))

是否有一个高效的SQLAlchemy等效的顶级SQL表达式?我并不认为它特别相关,但为了记录,我有兴趣针对PostgreSQL运行它。

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找这样的东西,你可以用一些变量名称改变:

from sqlalchemy import tuple_

   session.query(Ent).filter(tuple_(Ent.name, Ent.type).in_(items))

注释:

  

1.Item必须是元组列表

     

2.这适用于PostgreSQL,但与SQLite打破。

如果您不允许使用tuple_,还有另一种方法。让我知道,我会更新我的答案。