130 votes

Comment interroger une base de données par identifiant en utilisant SqlAlchemy ?

J'ai besoin d'interroger une base de données SQLAlchemy en fonction de son id quelque chose de similaire à

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

mais pour l'identité. Comment dois-je m'y prendre ? [La recherche sur Google et SO n'a rien donné.]

184voto

Mark Hildreth Points 9481

La requête a un fonction de réception qui prend en charge l'interrogation par la clé primaire de la table, ce qui, je suppose que id est.

Par exemple, pour rechercher un objet dont l'ID est 23 :

User.query.get(23)

Remarque : comme l'ont mentionné quelques autres commentateurs et réponses, il ne s'agit pas simplement d'un raccourci pour "Effectuer une requête en filtrant sur la clé primaire". En fonction de l'état de la session SQLAlchemy, l'exécution de ce code peut interroger la base de données et renvoyer une nouvelle instance, ou renvoyer une instance d'un objet interrogé plus tôt dans votre code sans interroger réellement la base de données. Si vous ne l'avez pas encore fait, pensez à lire l'article intitulé documentation sur la session SQLAlchemy pour comprendre les ramifications.

67voto

peggygao1988 Points 619

Vous pouvez interroger un utilisateur avec id = 1 comme suit

session.query(User).get(1)

11voto

panda912 Points 121

get() ne correspond pas toujours à vos attentes :

si votre transaction a été faite :

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

si vous êtes dans une transaction (get() vous donnera l'objet résultat en mémoire sans interroger la base de données) :

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

Il est préférable d'utiliser ceci :

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

3voto

octaedro Points 91

Si vous utilisez tables reflection vous pourriez avoir des problèmes avec les solutions proposées. (Les solutions précédentes ici n'ont pas fonctionné pour moi).

Ce que j'ai fini par utiliser est :

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

( object a été récupéré par réflexion depuis la base de données, c'est pourquoi vous devez utiliser .__class__ )

J'espère que cela vous aidera.

1voto

Justin Lee Points 548

Tout d'abord, vous devez définir id comme clé primaire.
Vous pourriez alors utiliser le query.get() pour interroger les objets par id qui est déjà la clé primaire.

Depuis le query.get() pour interroger les objets par la clé primaire.
Déduit de Documentation de 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X