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