SQLAlchemy Core - Sử dụng SQL văn bản
SQLAlchemy cho phép bạn chỉ sử dụng chuỗi, đối với những trường hợp khi SQL đã được biết đến và không cần câu lệnh mạnh mẽ để hỗ trợ các tính năng động. Cấu trúc text () được sử dụng để soạn một câu lệnh dạng văn bản được chuyển đến cơ sở dữ liệu hầu như không thay đổi.
Nó tạo ra một TextClause, đại diện trực tiếp cho một chuỗi SQL văn bản như được hiển thị trong đoạn mã dưới đây -
from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)
Những lợi thế text() cung cấp trên một chuỗi đơn giản là -
- hỗ trợ trung lập phụ trợ cho các tham số ràng buộc
- các tùy chọn thực thi mỗi câu lệnh
- hành vi nhập cột kết quả
Hàm text () yêu cầu tham số Bound ở định dạng dấu hai chấm được đặt tên. Chúng nhất quán bất kể phụ trợ cơ sở dữ liệu. Để gửi các giá trị cho các tham số, chúng tôi truyền chúng vào phương thức execute () như các đối số bổ sung.
Ví dụ sau sử dụng các tham số liên kết trong SQL văn bản:
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()
Hàm text () xây dựng biểu thức SQL như sau:
select students.name, students.lastname from students where students.name between ? and ?
Các giá trị của x = 'A' và y = 'L' được chuyển dưới dạng tham số. Kết quả là danh sách các hàng có tên từ 'A' đến 'L' -
[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]
Cấu trúc text () hỗ trợ các giá trị ràng buộc được thiết lập trước bằng phương thức TextClause.bindparams (). Các tham số cũng có thể được nhập rõ ràng như sau:
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()
Bạn cũng có thể dùng and_() hàm kết hợp nhiều điều kiện trong mệnh đề WHERE được tạo với sự trợ giúp của hàm 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()
Đoạn mã trên tìm nạp các hàng có tên từ “A” đến “L” với id lớn hơn 2. Đầu ra của mã được đưa ra bên dưới:
[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]