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

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.


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'))

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()

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).


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


-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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.