Flask SQLAlchemy, tentukan nama kolom

126

Bagaimana cara menentukan kolom yang saya inginkan dalam kueri saya menggunakan model (ini memilih semua kolom secara default)? Saya tahu bagaimana melakukan ini dengan sesi sqlalchmey:, session.query(self.col1)tapi bagaimana cara melakukannya dengan model? Saya tidak bisa SomeModel.query(). Apakah ada jalan

Matthew Scragg
sumber

Jawaban:

221

Anda dapat menggunakan with_entities()metode ini untuk membatasi kolom mana yang ingin Anda kembalikan dalam hasil. ( dokumentasi )

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

Bergantung pada kebutuhan Anda, Anda mungkin juga menganggap penangguhan berguna. Mereka memungkinkan Anda untuk mengembalikan objek penuh tetapi membatasi kolom yang melewati kabel.

David McKeone
sumber
21
with_entities () membuat semua () menghasilkan tupel nilai kolom, bukan objek!
kolypto
10
kolypto: Itu menghasilkan apa pun yang Anda minta. SomeModel.query.with_entities (SomeModel) akan menghasilkan objek. Sama seperti session.query (SomeModel.col1, SomeModel.col2) akan menghasilkan tupel nilai kolom. Tangguhan adalah apa yang akan Anda gunakan jika Anda tidak ingin kolom melewati kabel, tetapi Anda tetap menginginkan keseluruhan objek.
David McKeone
2
Terima kasih berhasil. Tapi bagaimana kita bisa menetapkan alias ke lapangan? Karena dalam kasus saya, saya menggunakan JOIN dan IDbidang konflik yang ada di kedua tabel
Mitul Shah
Ya saya punya pertanyaan yang sama dengan @MitulShah, bagaimana cara mengatur alias?
Nam G VU
Untuk alias, lihat jawaban singkat di bawah ini yaitu. gunakan .label() stackoverflow.com/a/11535992/248616
Nam G VU
69
session.query().with_entities(SomeModel.col1)

sama dengan

session.query(SomeModel.col1)

untuk alias, kita bisa menggunakan .label ()

session.query(SomeModel.col1.label('some alias name'))
Salil
sumber
2
Yang kedua terdengar lebih logis dan lebih pendek - menang / menang
fgblomqvist
7
Pernyataan pertama Anda salah. Anda membutuhkan tanda kurung. Jadi, seharusnya terbaca:session.query().with_entities(SomeModel.col1)
JGFMK
Opsi pertama (dan ketiga) adalah yang terbaik, sejauh ini, jika Anda ingin menggunakan kembali objek kueri yang ada, terutama dalam kasus melakukan beberapa subkueri kompleks.
Jamie Strauss
36

Anda dapat menggunakan fungsi load_only :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()
Vlad Bezden
sumber
1
Solusi ini adalah yang terbaik karena masih berfungsi sebagai Objek tidak hanya daftar hasil.
rborodinov
Kudos to you for this solution. Ini memiliki banyak keuntungan: - mengembalikan jenis objek yang sama persis dengan .first()dan .one()(yang akan malas / ingin memuat bidang dan relasi), - dapat disetel sebagai komponen kueri
Damien
kodenya bersih tetapi kueri sql memilih semua bidang dari database. Saya telah menggunakan with_entitiesseperti yang diberikan dalam jawaban yang diterima dan kueri yang dipilih hanya bidang itu /.
Srikanth Jeeva
11

Anda dapat menggunakan Model.query, karena Model(atau biasanya kelas dasarnya, terutama dalam kasus di mana ekstensi deklaratif digunakan) ditetapkan Sesssion.query_property. Dalam hal Model.queryini sama dengan Session.query(Model).

Saya tidak mengetahui cara mengubah kolom yang dikembalikan oleh kueri (kecuali dengan menambahkan lebih banyak menggunakan add_columns()).
Jadi bidikan terbaik Anda adalah menggunakan Session.query(Model.col1, Model.col2, ...)(seperti yang telah ditunjukkan oleh Salil).

mobil van
sumber
Saya yakin mungkin juga ada cara untuk melakukan ini dengan daftar kolom untuk nilai kueri () juga, docs.sqlalchemy.org/en/latest/orm/… - tetapi gula sintaksis untuk daftar tersebut tidak terlihat oleh saya saat ini.
JGFMK
3

Anda dapat menggunakan Query.values, Query.values

session.query(SomeModel).values('id', 'user')

gaozhidf.dll
sumber
-11

Contohnya di sini:

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

Saya menanyakan db untuk film dengan rating <> 0, lalu saya mengurutkannya berdasarkan rating dengan rating tertinggi terlebih dahulu.

Coba lihat di sini: Select, Insert, Delete di Flask-SQLAlchemy

happygoat
sumber