วัตถุเซสชัน SQL Alchemy มีexecute
วิธีการของตนเอง:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
แบบสอบถามแอปพลิเคชันทั้งหมดของคุณควรผ่านเซสชันวัตถุไม่ว่าจะเป็น SQL ดิบหรือไม่ สิ่งนี้ช่วยให้มั่นใจได้ว่าแบบสอบถามได้รับการจัดการอย่างเหมาะสมโดยธุรกรรมซึ่งอนุญาตให้มีหลายแบบสอบถามในคำขอเดียวกันที่จะส่งหรือย้อนกลับเป็นหน่วยเดียว การออกไปข้างนอกการทำธุรกรรมโดยใช้เอ็นจิ้นหรือการเชื่อมต่อจะทำให้คุณมีความเสี่ยงที่จะเกิดความละเอียดอ่อนซึ่งอาจเป็นเรื่องยากที่จะตรวจจับข้อบกพร่องที่อาจทำให้ข้อมูลเสียหาย คำขอแต่ละรายการควรเชื่อมโยงกับธุรกรรมเดียวเท่านั้นและการใช้db.session
จะทำให้แน่ใจว่าเป็นกรณีสำหรับใบสมัครของคุณ
ยังรับทราบว่าexecute
ถูกออกแบบมาสำหรับแบบสอบถาม ใช้พารามิเตอร์เช่น:val
ในตัวอย่างสำหรับอินพุตใด ๆ ในเคียวรีเพื่อป้องกันตัวคุณจากการโจมตีของการฉีด SQL คุณสามารถระบุค่าสำหรับพารามิเตอร์เหล่านี้โดยส่งผ่านdict
เป็นอาร์กิวเมนต์ที่สองโดยที่แต่ละคีย์คือชื่อของพารามิเตอร์ตามที่ปรากฏในแบบสอบถาม ไวยากรณ์ที่แน่นอนของพารามิเตอร์นั้นอาจแตกต่างกันไปขึ้นอยู่กับฐานข้อมูลของคุณ แต่ฐานข้อมูลเชิงสัมพันธ์ที่สำคัญทั้งหมดสนับสนุนในบางรูปแบบ
สมมติว่ามันเป็นSELECT
แบบสอบถามนี้จะกลับiterableของRowProxy
วัตถุ
คุณสามารถเข้าถึงแต่ละคอลัมน์ด้วยเทคนิคที่หลากหลาย:
for r in result:
print(r[0]) # Access by positional index
print(r['my_column']) # Access by column name as a string
r_dict = dict(r.items()) # convert to dict keyed by column names
โดยส่วนตัวแล้วฉันชอบที่จะแปลงผลลัพธ์เป็นnamedtuple
s:
from collections import namedtuple
Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
print(r.my_column)
print(r)
หากคุณไม่ได้ใช้ส่วนขยาย Flask-SQLAlchemy คุณยังสามารถใช้เซสชันได้อย่างง่ายดาย:
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))
s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})