SQLAlchemy Core - การใช้ Textual SQL

SQLAlchemy ช่วยให้คุณใช้สตริงได้สำหรับกรณีเหล่านั้นเมื่อรู้จัก SQL แล้วและไม่จำเป็นต้องมีคำสั่งเพื่อรองรับคุณสมบัติไดนามิก โครงสร้าง text () ใช้ในการเขียนข้อความที่ส่งผ่านไปยังฐานข้อมูลโดยส่วนใหญ่ไม่มีการเปลี่ยนแปลง

มันสร้างไฟล์ TextClauseแทนสตริง SQL ที่เป็นข้อความโดยตรงดังที่แสดงในโค้ดด้านล่าง -

from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)

ข้อดี text() ให้มากกว่าสตริงธรรมดาคือ -

  • การสนับสนุนแบ็กเอนด์เป็นกลางสำหรับพารามิเตอร์การผูก
  • ตัวเลือกการดำเนินการต่อคำสั่ง
  • ลักษณะการพิมพ์คอลัมน์ผลลัพธ์

ฟังก์ชัน text () ต้องการพารามิเตอร์ Bound ในรูปแบบโคลอนที่มีชื่อ มีความสอดคล้องกันโดยไม่คำนึงถึงแบ็กเอนด์ฐานข้อมูล ในการส่งค่าสำหรับพารามิเตอร์เราส่งผ่านเข้าไปในเมธอด execute () เป็นอาร์กิวเมนต์เพิ่มเติม

ตัวอย่างต่อไปนี้ใช้พารามิเตอร์ที่ถูกผูกไว้ใน SQL แบบข้อความ -

from sqlalchemy.sql import text
s = text("select students.name, students.lastname from students where students.name between :x and :y")
conn.execute(s, x = 'A', y = 'L').fetchall()

ฟังก์ชัน text () สร้างนิพจน์ SQL ดังนี้ -

select students.name, students.lastname from students where students.name between ? and ?

ค่าของ x = 'A' และ y = 'L' จะถูกส่งผ่านเป็นพารามิเตอร์ ผลลัพธ์คือรายการของแถวที่มีชื่ออยู่ระหว่าง 'A' และ 'L' -

[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]

โครงสร้าง text () รองรับค่าขอบเขตที่กำหนดไว้ล่วงหน้าโดยใช้เมธอด TextClause.bindparams () นอกจากนี้ยังสามารถพิมพ์พารามิเตอร์อย่างชัดเจนได้ดังนี้ -

stmt = text("SELECT * FROM students WHERE students.name BETWEEN :x AND :y")

stmt = stmt.bindparams(
   bindparam("x", type_= String), 
   bindparam("y", type_= String)
)

result = conn.execute(stmt, {"x": "A", "y": "L"})

The text() function also be produces fragments of SQL within a select() object that 
accepts text() objects as an arguments. The “geometry” of the statement is provided by 
select() construct , and the textual content by text() construct. We can build a statement 
without the need to refer to any pre-established Table metadata. 

from sqlalchemy.sql import select
s = select([text("students.name, students.lastname from students")]).where(text("students.name between :x and :y"))
conn.execute(s, x = 'A', y = 'L').fetchall()

คุณยังสามารถใช้ and_() ฟังก์ชันเพื่อรวมหลายเงื่อนไขในส่วนคำสั่ง WHERE ที่สร้างขึ้นด้วยความช่วยเหลือของฟังก์ชัน text ()

from sqlalchemy import and_
from sqlalchemy.sql import select
s = select([text("* from students")]) \
.where(
   and_(
      text("students.name between :x and :y"),
      text("students.id>2")
   )
)
conn.execute(s, x = 'A', y = 'L').fetchall()

โค้ดด้านบนดึงข้อมูลแถวที่มีชื่อระหว่าง“ A” และ“ L” ที่มี id มากกว่า 2 ผลลัพธ์ของโค้ดได้รับด้านล่าง

[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]