SQLAlchemyORM-テキストSQL

以前、text()関数を使用したテキストSQLは、SQLAlchemyのコア式言語の観点から説明されていました。次に、ORMの観点から説明します。

リテラル文字列は、text()構造で使用を指定することにより、Queryオブジェクトで柔軟に使用できます。最も適切な方法はそれを受け入れます。たとえば、filter()とorder_by()です。

以下の例では、filter()メソッドが文字列「id <3」をWHEREid <3に変換します。

from sqlalchemy import text
for cust in session.query(Customers).filter(text("id<3")):
   print(cust.name)

生成された生のSQL式は、以下に示すコードを使用したWHERE句へのフィルターの変換を示しています。

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
WHERE id<3

Customersテーブルのサンプルデータから、2つの行が選択され、名前の列が次のように出力されます。

Ravi Kumar
Komal Pande

文字列ベースのSQLでバインドパラメータを指定するには、コロンを使用し、値を指定するには、params()メソッドを使用します。

cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()

Pythonコンソールに表示される有効なSQLは次のようになります-

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
WHERE id = ?

完全に文字列ベースのステートメントを使用するには、完全なステートメントを表すtext()構造をfrom_statement()に渡すことができます。

session.query(Customers).from_statement(text("SELECT * FROM customers")).all()

上記のコードの結果は、以下に示す基本的なSELECTステートメントになります-

SELECT * FROM customers

明らかに、customersテーブルのすべてのレコードが選択されます。

text()構造を使用すると、テキストSQLをコアまたはORMにマップされた列式に位置的にリンクできます。これは、列式を位置引数としてTextClause.columns()メソッドに渡すことで実現できます。

stmt = text("SELECT name, id, name, address, email FROM customers")
stmt = stmt.columns(Customers.id, Customers.name)
session.query(Customers.id, Customers.name).from_statement(stmt).all()

上記のコードで生成された式に続いてSQLiteエンジンが実行されても、すべての行のid列とname列が選択され、text()メソッドのすべての列が表示されます-

SELECT name, id, name, address, email FROM customers