Cum să interoghezi baza de date după id folosind SqlAlchemy? (Programare, Python, Sql, Model, Sqlalchemy)

user507220 a intrebat.

Am nevoie să interoghez o bază de date SQLAlchemy după ID-ul său id ceva similar cu

User.query.filter_by(username=’peter’)

dar pentru id. Cum pot face acest lucru? [Căutând pe Google și SO nu m-a ajutat]

Comentarii

  • Vă rugăm să furnizați mai multe detalii, cum ar fi SQL echivalent sau pseudocod care să facă ceea ce doriți. Ce este „SQLAlchemy database id”? –  > Por Daniel Kluev.
  • Tabelul dvs. are o coloană id? –  > Por Keith.
5 răspunsuri
Mark Hildreth

Interogarea are o funcția get care acceptă interogarea prin cheia primară a tabelului, ceea ce presupun că id este.

De exemplu, pentru a căuta un obiect cu ID-ul 23:

User.query.get(23)

Notă: După cum au menționat alți câțiva comentatori și răspunsuri, aceasta nu este pur și simplu o prescurtare pentru „Efectuați o interogare care filtrează pe cheia primară”. În funcție de starea sesiunii SQLAlchemy, rularea acestui cod poate interoga baza de date și poate returna o nouă instanță sau poate returna o instanță a unui obiect interogat mai devreme în codul dvs. fără a interoga efectiv baza de date. Dacă nu ați făcut deja acest lucru, luați în considerare citirea cărții documentația privind sesiunea SQLAlchemy pentru a înțelege ramificațiile.

Comentarii

  • Funcția Get suportă, de asemenea, chei primare multiple: YourModel.query.get((pk1, pk2)). Observați tupla. –  > Por marc_aragones.
  • get() interoghează obiectele în funcție de cheia primară. Dacă doriți să interogați după idtrebuie să setați id ca cheie primară mai întâi. – user10875014
peggygao1988

Puteți interoga un utilizator cu id = 1 astfel

session.query(User).get(1)

panda912

get() nu este așa cum vă așteptați uneori:

dacă tranzacția dvs. a fost efectuată:

>>> session.query(User).get(1)
[SQL]: BEGIN (implicit)
[SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
FROM user
WHERE user.id = ?
[SQL]: (1,)
<User(u'ed', u'Ed Jones')>

dacă vă aflați într-o tranzacție (get() vă va oferi obiectul rezultat în memorie fără a interoga baza de date):

>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>

este mai bine să folosiți acest lucru:

>>> session.query(User.name).filter(User.id == 1).first()
[SQL]: SELECT user.name AS user_name
FROM user
WHERE user.id = ?
 LIMIT ? OFFSET ?
[SQL]: (1, 1, 0)
(u'Edwardo',)

Comentarii

  • Cum este acest comportament neașteptat? –  > Por Solomon Ucko.
  • Mă refer la faptul că, dacă sunteți într-o tranzacție (nu session.commit încă), rezultatul get() pare să vă ofere obiectul rezultat în memorie(fără a interoga efectiv baza de date), dar filter().first() va interoga întotdeauna baza de date. –  > Por panda912.
  • Este posibilă modificarea concomitentă a bazei de date în timpul tranzacției? Dacă nu, folosind get este mai bună datorită creșterii eficienței. –  > Por Solomon Ucko.
  • după cum știu, sqlalchemy nu poate lucra cu chestii asincrone ( se pare că doar cu gevent ), și da, se poate lucra cu get este mai eficientă. –  > Por panda912.
  • De ce este .first() diferit de .get() în ceea ce privește tranzacția? .first() se întoarce întotdeauna la baza de date? Se întâmplă că .get() se uită mai întâi în mediul curent pentru a vedea dacă știe acel id sau ceva de genul acesta? –  > Por msouth.
octaedro

Dacă folosiți tables reflection s-ar putea să aveți probleme cu soluțiile date.(Soluțiile anterioare de aici nu au funcționat pentru mine).

Ceea ce am ajuns să folosesc a fost:

session.query(object._class_).get(id)

(object a fost recuperat prin reflexie din baza de date, de aceea trebuie să folosiți .__class__)

Sper că vă ajută.

Justin Lee

În primul rând, ar trebui să setați id ca cheie primară.
Apoi, ați putea utiliza query.get() pentru a interoga obiectele în funcție de id care este deja cheia primară.

Deoarece metoda query.get() pentru interogarea obiectelor în funcție de cheia primară.
Dedusă din Documentația Flask-SQLAlchemy

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

def test():
    id = 1
    user = User.query.get(id)