Chọn dữ liệu từ một Table với SQLAlchemy
Bạn làm rất tốt đến đây rồi! Giờ là lúc xây dựng câu lệnh select đầu tiên bằng SQLAlchemy. SQLAlchemy cung cấp một cách tương tác với cơ sở dữ liệu “rất Pythonic”. Ở bài trước khi dùng SQL thuần, bạn truy vấn trực tiếp cơ sở dữ liệu. Khi dùng SQLAlchemy, bạn sẽ làm việc thông qua một đối tượng Table, và SQLAlchemy sẽ lo việc chuyển truy vấn của bạn thành câu lệnh SQL phù hợp. Nhờ vậy, thay vì phải xử lý khác biệt giữa các biến thể SQL truyền thống như MySQL hay PostgreSQL, bạn có thể tận dụng khung Pythonic của SQLAlchemy để tinh gọn quy trình và truy vấn dữ liệu hiệu quả hơn. Vì lý do này, SQLAlchemy rất đáng để học ngay cả khi bạn đã quen với SQL truyền thống.
Trong bài này, bạn sẽ tiếp tục xây dựng một câu lệnh để truy vấn tất cả bản ghi từ bảng census. Tuy nhiên, lần này bạn sẽ dùng hàm select() của mô-đun sqlalchemy. Hàm này yêu cầu một đối số bắt buộc là danh sách các bảng hoặc cột: ví dụ, select([my_table]).
Bạn cũng sẽ chỉ lấy một vài bản ghi từ ResultProxy bằng cách dùng .fetchmany() với đối số size để chỉ định số bản ghi cần lấy.
Table và MetaData đã được import. Metadata có sẵn dưới tên metadata và kết nối tới cơ sở dữ liệu là connection.
Bài tập này là một phần của khóa học
Nhập môn Cơ sở dữ liệu với Python
Hướng dẫn bài tập
- Import
selecttừ mô-đunsqlalchemy. - Phản chiếu (reflect) bảng
census. Đoạn mã này đã được viết sẵn cho bạn. - Tạo một truy vấn bằng hàm
select()để lấy tất cả bản ghi trong bảngcensus. Để làm vậy, truyền vàoselect()một danh sách chỉ có một phần tử:census. - In
stmtđể xem câu lệnh SQL thực tế được tạo ra. Đoạn mã này đã được viết sẵn cho bạn. - Lấy 10 bản ghi từ bảng
censusvà lưu vàoresults. Thực hiện như sau:- Dùng phương thức
.execute()trênconnectionvới đối số làstmtđể nhận ResultProxy. - Dùng
.fetchmany()với đối sốsizephù hợp trênconnection.execute(stmt)để lấy ResultSet.
- Dùng phương thức
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# Import select
from ____ import ____
# Reflect census table via engine: census
census = Table('census', metadata, autoload=True, autoload_with=engine)
# Build select statement for census table: stmt
stmt = ____
# Print the emitted statement to see the SQL string
print(stmt)
# Execute the statement on connection and fetch 10 records: result
results = ____.____(____).____(size=___)
# Execute the statement and print the results
print(results)