ฉันจะระบุคอลัมน์ที่ฉันต้องการในแบบสอบถามของฉันโดยใช้แบบจำลองได้อย่างไร (จะเลือกคอลัมน์ทั้งหมดตามค่าเริ่มต้น) ฉันรู้วิธีทำกับเซสชัน sqlalchmey: session.query(self.col1)
แต่ฉันจะทำกับโมเดลได้อย่างไร SomeModel.query()
ฉันไม่สามารถทำ มีวิธีไหม?
ฉันจะระบุคอลัมน์ที่ฉันต้องการในแบบสอบถามของฉันโดยใช้แบบจำลองได้อย่างไร (จะเลือกคอลัมน์ทั้งหมดตามค่าเริ่มต้น) ฉันรู้วิธีทำกับเซสชัน sqlalchmey: session.query(self.col1)
แต่ฉันจะทำกับโมเดลได้อย่างไร SomeModel.query()
ฉันไม่สามารถทำ มีวิธีไหม?
คำตอบ:
คุณสามารถใช้with_entities()
วิธี จำกัด คอลัมน์ที่คุณต้องการส่งคืนในผลลัพธ์ ( เอกสารประกอบ )
result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
ทั้งนี้ขึ้นอยู่กับความต้องการของคุณคุณอาจพบว่าการรอการตัดบัญชีมีประโยชน์ อนุญาตให้คุณส่งคืนวัตถุทั้งหมด แต่ จำกัด คอลัมน์ที่มาทับเส้นลวด
ID
ฟิลด์ความขัดแย้งซึ่งมีอยู่ในทั้งสองตาราง
.label()
stackoverflow.com/a/11535992/248616
session.query().with_entities(SomeModel.col1)
เหมือนกับ
session.query(SomeModel.col1)
สำหรับนามแฝงเราสามารถใช้. label ()
session.query(SomeModel.col1.label('some alias name'))
session.query().with_entities(SomeModel.col1)
คุณสามารถใช้ฟังก์ชันload_only :
from sqlalchemy.orm import load_only
fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()
.first()
และ.one()
(ซึ่งจะขี้เกียจ / กระตือรือร้นในการโหลดฟิลด์และความสัมพันธ์) - สามารถตั้งค่าเป็นองค์ประกอบการสืบค้นได้
with_entities
ตามที่ระบุในคำตอบที่ยอมรับและแบบสอบถามเลือกเฉพาะฟิลด์นั้น /
คุณสามารถใช้ได้Model.query
เนื่องจากModel
(หรือโดยปกติจะเป็นคลาสพื้นฐานโดยเฉพาะอย่างยิ่งในกรณีที่มีการใช้ส่วนขยายที่เปิดเผย)Sesssion.query_property
ที่ได้รับมอบหมาย ในกรณีนี้Model.query
จะเทียบเท่ากับSession.query(Model)
.
ฉันไม่ทราบวิธีแก้ไขคอลัมน์ที่ส่งคืนโดยแบบสอบถาม (ยกเว้นการเพิ่มโดยใช้add_columns()
)
ดังนั้นช็อตที่ดีที่สุดของคุณคือใช้Session.query(Model.col1, Model.col2, ...)
(ตามที่สลิลแสดงไว้แล้ว)
คุณสามารถใช้ Query.values, Query.values
session.query(SomeModel).values('id', 'user')
ตัวอย่างที่นี่:
movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()
ฉันสอบถาม db สำหรับภาพยนตร์ที่มีเรต <> 0 จากนั้นฉันเรียงลำดับตามการให้คะแนนที่มีการให้คะแนนสูงสุดก่อน
ดูที่นี่: เลือกแทรกลบใน Flask-SQLAlchemy