SQLAlchemy ORM - Textual SQL

ก่อนหน้านี้ข้อความ SQL ที่ใช้ฟังก์ชัน text () ได้รับการอธิบายจากมุมมองของภาษานิพจน์หลักของ SQLAlchemy ตอนนี้เราจะพูดคุยจากมุมมองของ ORM

สามารถใช้สตริงตัวอักษรได้อย่างยืดหยุ่นกับวัตถุ Query โดยระบุการใช้งานด้วยโครงสร้าง text () วิธีการที่ใช้ได้ส่วนใหญ่ยอมรับ ตัวอย่างเช่น 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

จากข้อมูลตัวอย่างของเราในตารางลูกค้าจะมีการเลือกสองแถวและคอลัมน์ชื่อจะถูกพิมพ์ดังนี้ -

Ravi Kumar
Komal Pande

ในการระบุพารามิเตอร์การผูกด้วย SQL แบบสตริงให้ใช้โคลอนและเพื่อระบุค่าให้ใช้เมธอด params ()

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

SQL ที่มีประสิทธิภาพที่แสดงบนคอนโซล Python จะเป็นดังที่ระบุด้านล่าง -

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 = ?

ในการใช้คำสั่งแบบสตริงทั้งหมดข้อความ () สร้างแทนคำสั่งที่สมบูรณ์สามารถส่งผ่านไปยัง from_statement ()

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

ผลลัพธ์ของโค้ดด้านบนจะเป็นคำสั่ง SELECT พื้นฐานตามที่ระบุด้านล่าง -

SELECT * FROM customers

เห็นได้ชัดว่าระเบียนทั้งหมดในตารางลูกค้าจะถูกเลือก

โครงสร้าง text () ช่วยให้เราสามารถเชื่อมโยง SQL ที่เป็นข้อความกับนิพจน์คอลัมน์ Core หรือ 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()

คอลัมน์ id และชื่อของแถวทั้งหมดจะถูกเลือกแม้ว่าเอ็นจิ้น SQLite จะเรียกใช้นิพจน์ต่อไปนี้ที่สร้างโดยโค้ดด้านบนจะแสดงคอลัมน์ทั้งหมดใน text () วิธีการ -

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