แบบสอบถาม Flask SQLAlchemy ระบุชื่อคอลัมน์


126

ฉันจะระบุคอลัมน์ที่ฉันต้องการในแบบสอบถามของฉันโดยใช้แบบจำลองได้อย่างไร (จะเลือกคอลัมน์ทั้งหมดตามค่าเริ่มต้น) ฉันรู้วิธีทำกับเซสชัน sqlalchmey: session.query(self.col1)แต่ฉันจะทำกับโมเดลได้อย่างไร SomeModel.query()ฉันไม่สามารถทำ มีวิธีไหม?

คำตอบ:


221

คุณสามารถใช้with_entities()วิธี จำกัด คอลัมน์ที่คุณต้องการส่งคืนในผลลัพธ์ ( เอกสารประกอบ )

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

ทั้งนี้ขึ้นอยู่กับความต้องการของคุณคุณอาจพบว่าการรอการตัดบัญชีมีประโยชน์ อนุญาตให้คุณส่งคืนวัตถุทั้งหมด แต่ จำกัด คอลัมน์ที่มาทับเส้นลวด


21
with_entities () ทำให้ all () ให้ค่า tuples ของค่าคอลัมน์ไม่ใช่วัตถุ!
kolypto

10
kolypto: ให้ผลตอบแทนทุกสิ่งที่คุณขอให้มันให้ผล SomeModel.query.with_entities (SomeModel) จะให้อ็อบเจกต์ เช่นเดียวกับ session.query (SomeModel.col1, SomeModel.col2) จะให้ค่าคอลัมน์ทั้งหมด รอการตัดบัญชีคือสิ่งที่คุณจะใช้หากคุณไม่ต้องการให้คอลัมน์มาทับเส้นลวด แต่คุณต้องการให้ทั้งวัตถุอยู่ดี
David McKeone

2
ขอบคุณมันใช้งานได้ แต่เราจะกำหนดนามแฝงให้กับฟิลด์ได้อย่างไร? เพราะในกรณีของฉันฉันใช้ JOIN และIDฟิลด์ความขัดแย้งซึ่งมีอยู่ในทั้งสองตาราง
Mitul Shah

ใช่ฉันมีคำถามเดียวกันกับ @MitulShah วิธีตั้งนามแฝง
Nam G VU

สำหรับนามแฝงโปรดดูคำตอบสั้น ๆ ด้านล่างเช่น ใช้.label() stackoverflow.com/a/11535992/248616
Nam G VU

69
session.query().with_entities(SomeModel.col1)

เหมือนกับ

session.query(SomeModel.col1)

สำหรับนามแฝงเราสามารถใช้. label ()

session.query(SomeModel.col1.label('some alias name'))

2
อันที่สองฟังดูมีเหตุผลมากกว่าและสั้นกว่า - win / win
fgblomqvist

7
คำพูดแรกของคุณผิด คุณต้องมีวงเล็บ ดังนั้นควรอ่าน:session.query().with_entities(SomeModel.col1)
JGFMK

ตัวเลือกแรก (และตัวที่สาม) เป็นตัวเลือกที่ดีที่สุดหากคุณต้องการใช้ออบเจ็กต์คิวรีที่มีอยู่ซ้ำโดยเฉพาะอย่างยิ่งในกรณีที่ดำเนินการสืบค้นย่อยที่ซับซ้อนหลายรายการ
Jamie Strauss

36

คุณสามารถใช้ฟังก์ชันload_only :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

1
โซลูชันนี้เป็นวิธีที่ดีที่สุดเนื่องจากยังคงทำงานเป็น Object ไม่เพียง แต่รายการผลลัพธ์เท่านั้น
rborodinov

ขอชื่นชมคุณสำหรับการแก้ปัญหานี้ มีข้อดีหลายประการ: - ส่งคืนวัตถุประเภทเดียวกันทุกประการกับ.first()และ.one()(ซึ่งจะขี้เกียจ / กระตือรือร้นในการโหลดฟิลด์และความสัมพันธ์) - สามารถตั้งค่าเป็นองค์ประกอบการสืบค้นได้
Damien

รหัสนั้นสะอาด แต่คิวรี sql จะเลือกฟิลด์ทั้งหมดจากฐานข้อมูล ฉันใช้with_entitiesตามที่ระบุในคำตอบที่ยอมรับและแบบสอบถามเลือกเฉพาะฟิลด์นั้น /
Srikanth Jeeva

11

คุณสามารถใช้ได้Model.queryเนื่องจากModel(หรือโดยปกติจะเป็นคลาสพื้นฐานโดยเฉพาะอย่างยิ่งในกรณีที่มีการใช้ส่วนขยายที่เปิดเผย)Sesssion.query_propertyที่ได้รับมอบหมาย ในกรณีนี้Model.queryจะเทียบเท่ากับSession.query(Model).

ฉันไม่ทราบวิธีแก้ไขคอลัมน์ที่ส่งคืนโดยแบบสอบถาม (ยกเว้นการเพิ่มโดยใช้add_columns())
ดังนั้นช็อตที่ดีที่สุดของคุณคือใช้Session.query(Model.col1, Model.col2, ...)(ตามที่สลิลแสดงไว้แล้ว)


ฉันเชื่อว่าอาจมีวิธีดำเนินการกับรายการคอลัมน์สำหรับค่าคิวรี () ด้วยเช่นกันdocs.sqlalchemy.org/en/latest/orm/… - แต่น้ำตาลวากยสัมพันธ์ของรายการทำให้ฉันหายไปในขณะนี้
JGFMK


-11

ตัวอย่างที่นี่:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

ฉันสอบถาม db สำหรับภาพยนตร์ที่มีเรต <> 0 จากนั้นฉันเรียงลำดับตามการให้คะแนนที่มีการให้คะแนนสูงสุดก่อน

ดูที่นี่: เลือกแทรกลบใน Flask-SQLAlchemy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.