การเลือกข้อมูลจากตารางด้วย SQLAlchemy
ทำได้ดีมากจนถึงตรงนี้! ถึงเวลาสร้าง select statement แรกด้วย SQLAlchemy แล้ว SQLAlchemy มอบวิธีการโต้ตอบกับฐานข้อมูลในแบบ "Pythonic" ที่สะดวกและเป็นระบบ ในแบบฝึกหัดที่แล้วที่ใช้ SQL ตรง ๆ คุณส่งคิวรีไปยังฐานข้อมูลโดยตรง แต่เมื่อใช้ SQLAlchemy จะทำงานผ่านออบเจ็กต์ Table แทน และ SQLAlchemy จะแปลงคิวรีของคุณให้เป็น SQL statement ที่เหมาะสมให้อัตโนมัติ ด้วยเหตุนี้ จึงไม่ต้องกังวลเรื่องความแตกต่างระหว่าง SQL dialect ต่าง ๆ เช่น MySQL หรือ PostgreSQL แต่สามารถใช้ประโยชน์จากเฟรมเวิร์กแบบ Pythonic ของ SQLAlchemy เพื่อทำให้ workflow คล่องตัวขึ้นและดึงข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น ด้วยเหตุนี้ SQLAlchemy จึงคุ้มค่าแก่การเรียนรู้ แม้ว่าคุณจะคุ้นเคยกับ SQL แบบดั้งเดิมอยู่แล้วก็ตาม
ในแบบฝึกหัดนี้ จะสร้าง statement เพื่อดึงข้อมูลทุกรายการจากตาราง census อีกครั้ง แต่คราวนี้จะใช้ฟังก์ชัน select() จากโมดูล sqlalchemy ฟังก์ชันนี้ต้องการ list ของตารางหรือคอลัมน์เป็นอาร์กิวเมนต์ที่จำเป็น เช่น select([my_table])
นอกจากนี้ยังจะดึงข้อมูลเพียงบางส่วนจาก ResultProxy โดยใช้ .fetchmany() พร้อมอาร์กิวเมนต์ size เพื่อระบุจำนวนรายการที่ต้องการ
Table และ MetaData ถูก import ไว้แล้ว โดย metadata พร้อมใช้งานในชื่อ metadata และการเชื่อมต่อฐานข้อมูลในชื่อ connection
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Python เบื้องต้นสำหรับฐานข้อมูล
คำแนะนำการฝึกหัด
- Import
selectจากโมดูลsqlalchemy - Reflect ตาราง
censusโดยโค้ดส่วนนี้เขียนไว้ให้แล้ว - สร้างคิวรีโดยใช้ฟังก์ชัน
select()เพื่อดึงข้อมูลทุกรายการในตารางcensusโดยส่ง list ที่มีสมาชิกเพียงหนึ่งตัวคือcensusเข้าไปในselect() - พิมพ์
stmtเพื่อดู SQL query ที่ถูกสร้างขึ้น โค้ดส่วนนี้เขียนไว้ให้แล้ว - ดึงข้อมูล 10 รายการจากตาราง
censusและเก็บไว้ในตัวแปรresultsโดยทำดังนี้:- ใช้เมธอด
.execute()บนconnectionโดยส่งstmtเป็นอาร์กิวเมนต์ เพื่อรับ ResultProxy - ใช้
.fetchmany()พร้อมอาร์กิวเมนต์sizeที่เหมาะสมบนconnection.execute(stmt)เพื่อดึง ResultSet
- ใช้เมธอด
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# 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)