Sqlalchemy-core-using-conjunctions
SQLAlchemyコア-接続詞の使用
接続詞は、SQL式のWHERE句で使用される関係演算子を実装するSQLAlchemyモジュールの関数です。 演算子AND、OR、NOTなどは、2つの個別の論理式を組み合わせた複合式を形成するために使用されます。 SELECTステートメントでANDを使用する簡単な例は次のとおりです-
SELECT * from EMPLOYEE WHERE salary>10000 AND age>30
SQLAlchemy関数and ()、or()およびnot_()は、それぞれAND、ORおよびNOT演算子を実装します。
and_()関数
ANDで結合された式の結合を生成します。 より良い理解のために例を以下に示します-
from sqlalchemy import and_
print(
and_(
students.c.name == 'Ravi',
students.c.id <3
)
)
これは次のように変換されます-
students.name = :name_1 AND students.id < :id_1
学生テーブルのselect()構造でand_()を使用するには、次のコード行を使用します-
stmt = select([students]).where(and_(students.c.name == 'Ravi', students.c.id <3))
次の性質のSELECT文が構築されます-
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1 AND students.id < :id_1
上記のSELECTクエリの出力を表示する完全なコードは次のとおりです-
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey, select
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
from sqlalchemy import and_, or_
stmt = select([students]).where(and_(students.c.name == 'Ravi', students.c.id <3))
result = conn.execute(stmt)
print (result.fetchall())
学生テーブルに前の例で使用したデータが入力されていると仮定して、次の行が選択されます-
[(1, 'Ravi', 'Kapoor')]
or_()関数
ORで結合された式の結合を生成します。 or_()を使用して、上記の例のstmtオブジェクトを次のものに置き換えます。
stmt = select([students]).where(or_(students.c.name == 'Ravi', students.c.id <3))
これは、次のSELECTクエリと実質的に同等です-
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1
OR students.id < :id_1
あなたが置換を行い、上記のコードを実行すると、結果はOR条件に該当する2行になります-
[(1, 'Ravi', 'Kapoor'),
(2, 'Rajiv', 'Khanna')]
asc()関数
昇順のORDER BY句を生成します。 関数は、関数をパラメーターとして適用する列を受け取ります。
from sqlalchemy import asc
stmt = select([students]).order_by(asc(students.c.name))
ステートメントは、次のSQL式を実装します-
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.name ASC
次のコードは、学生テーブルのすべてのレコードを名前列の昇順でリストします-
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey, select
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
from sqlalchemy import asc
stmt = select([students]).order_by(asc(students.c.name))
result = conn.execute(stmt)
for row in result:
print (row)
上記のコードは次の出力を生成します-
(4, 'Abdul', 'Sattar')
(3, 'Komal', 'Bhandari')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
desc()関数
同様に、desc()関数は次のように降順のORDER BY句を生成します-
from sqlalchemy import desc
stmt = select([students]).order_by(desc(students.c.lastname))
同等のSQL式は-
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.lastname DESC
そして、上記のコード行の出力は-
(4, 'Abdul', 'Sattar')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
(3, 'Komal', 'Bhandari')
between()関数
BETWEEN述語句を生成します。 これは通常、特定の列の値が範囲内にあるかどうかを検証するために使用されます。 たとえば、次のコードは、id列が2〜4の行を選択します-
from sqlalchemy import between
stmt = select([students]).where(between(students.c.id,2,4))
print (stmt)
結果のSQL式は次のようになります-
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.id
BETWEEN :id_1 AND :id_2
そして、結果は次のようになります-
(2, 'Rajiv', 'Khanna')
(3, 'Komal', 'Bhandari')
(4, 'Abdul', 'Sattar')