Sqlalchemy-orm-textual-sql

提供:Dev Guides
移動先:案内検索

SQLAlchemy ORM-テキストSQL

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

リテラル文字列は、text()構造で使用を指定することにより、Queryオブジェクトで柔軟に使用できます。 ほとんどの適用可能なメソッドはそれを受け入れます。 たとえば、filter()およびorder_by()。

以下の例では、filter()メソッドは文字列「id <3」をWHERE id <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

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

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列と名前列が選択されますtext()メソッドのすべての列を示します-

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