Flask SQLAlchemy truy vấn, chỉ định tên cột


125

Làm cách nào để chỉ định cột mà tôi muốn trong truy vấn của mình bằng một mô hình (nó chọn tất cả các cột theo mặc định)? Tôi biết cách làm điều này với phiên sqlalchmey : session.query(self.col1), nhưng làm thế nào để làm điều đó với các mô hình? Tôi không thể làm được SomeModel.query(). Là có một cách?

Câu trả lời:


220

Bạn có thể sử dụng with_entities()phương pháp này để hạn chế các cột bạn muốn trả về trong kết quả. ( tài liệu )

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

Tùy thuộc vào yêu cầu của bạn, bạn cũng có thể thấy việc hoãn lại hữu ích. Chúng cho phép bạn trả lại toàn bộ đối tượng nhưng hạn chế các cột đi qua dây.


21
with_entities () làm cho tất cả () mang lại các bộ giá trị cột, không phải đối tượng!
kolypto

10
kolypto: Nó mang lại bất cứ thứ gì bạn yêu cầu nó mang lại. SomeModel.query.with_entities (SomeModel) sẽ mang lại đối tượng. Cũng giống như session.query (SomeModel.col1, SomeModel.col2) sẽ mang lại nhiều giá trị cột. Trì hoãn là những gì bạn sẽ sử dụng nếu bạn không muốn cột vượt qua dây, nhưng bạn vẫn muốn toàn bộ đối tượng.
David McKeone

2
Cảm ơn nó hoạt động. Nhưng làm thế nào chúng ta có thể gán bí danh cho trường? Bởi vì trong trường hợp của tôi, tôi đang sử dụng JOIN và mâu thuẫn IDlĩnh vực mà hiện diện trong cả hai bảng
Mitul Shah

Vâng, tôi có cùng câu hỏi với @MitulShah, làm thế nào để đặt bí danh?
Nam G VU

Đối với bí danh, hãy xem câu trả lời ngắn gọn này bên dưới tức là. sử dụng .label() stackoverflow.com/a/11535992/248616
Nam G VU

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

giống như

session.query(SomeModel.col1)

đối với bí danh, chúng ta có thể sử dụng .label ()

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

2
Điều thứ hai cả âm thanh hợp lý hơn và ngắn hơn - thắng / thắng
fgblomqvist

7
Tuyên bố đầu tiên của bạn là sai. Bạn cần dấu ngoặc đơn. Vì vậy, nó sẽ đọc:session.query().with_entities(SomeModel.col1)
JGFMK

Cho đến nay, các tùy chọn đầu tiên (và thứ ba) là tốt nhất nếu bạn muốn sử dụng lại các đối tượng truy vấn hiện có, đặc biệt là trong trường hợp thực hiện nhiều truy vấn con phức tạp.
Jamie Strauss

36

Bạn có thể sử dụng hàm load_only :

from sqlalchemy.orm import load_only

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

1
Giải pháp này là giải pháp tốt nhất vì nó vẫn đang hoạt động như một Đối tượng không chỉ là danh sách kết quả.
rborodinov

Kudo cho bạn cho giải pháp này. Nó có nhiều ưu điểm: - trả về chính xác cùng loại đối tượng .first().one()(điều đó sẽ làm chậm / háo các trường và quan hệ tải), - có thể được đặt làm thành phần truy vấn
Damien

mã sạch nhưng truy vấn sql chọn tất cả các trường từ cơ sở dữ liệu. Tôi đã sử dụng with_entitiesnhư đã cho trong câu trả lời được chấp nhận và truy vấn chỉ chọn trường đó /.
Srikanth Jeeva

11

Bạn có thể sử dụng Model.query, bởi vì Model(hoặc thường là lớp cơ sở của nó, đặc biệt là trong các trường hợp sử dụng phần mở rộng khai báo) Sesssion.query_property. Trong trường hợp Model.querynày, tương đương vớiSession.query(Model) .

Tôi không biết cách sửa đổi các cột được trả về bởi truy vấn (ngoại trừ bằng cách sử dụng thêm các cột khác add_columns()).
Vì vậy, cách tốt nhất của bạn là sử dụng Session.query(Model.col1, Model.col2, ...)(như đã được hiển thị bởi Salil).


Tôi tin rằng cũng có thể có một cách để thực hiện việc này với danh sách các cột cho các giá trị truy vấn (), docs.sqlalchemy.org/en/latest/orm/… - nhưng đường cú pháp cho danh sách hiện vẫn chưa hiểu tôi.
JGFMK


-11

Một ví dụ ở đây:

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

Tôi truy vấn db cho các phim có xếp hạng <> 0, và sau đó tôi sắp xếp chúng theo xếp hạng có xếp hạng cao nhất trước.

Hãy xem ở đây: Chọn, Chèn, Xóa trong Flask-SQLAlchemy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.