Necesito consultar una base de datos SQLAlchemy por id
algo similar a
User.query.filter_by (nombre de usuario = 'peter')
pero para id. ¿Cómo hago esto? [Buscar en Google y SO no ayudó]
python
sql
model
sqlalchemy
Oerd
fuente
fuente
Respuestas:
Query tiene una función de obtención que admite consultas mediante la clave principal de la tabla, que supongo que sí
id
.Por ejemplo, para consultar un objeto con ID de 23:
User.query.get(23)
Nota: Como han mencionado algunos otros comentaristas y respuestas, esto no es simplemente una abreviatura de "Realizar un filtrado de consultas en la clave principal". Dependiendo del estado de la sesión de SQLAlchemy, ejecutar este código puede consultar la base de datos y devolver una nueva instancia, o puede devolver una instancia de un objeto consultado anteriormente en su código sin consultar realmente la base de datos. Si aún no lo ha hecho, considere leer la documentación sobre la sesión de SQLAlchemy para comprender las ramificaciones.
fuente
YourModel.query.get((pk1, pk2))
. Observe la tupla.get()
función consulta objetos por clave primaria. Si desea realizar una consultaid
,id
primero debe establecerla como clave principal.Puede consultar a un usuario con id = 1 como este
session.query(User).get(1)
fuente
get () no es como esperabas a veces:
si su transacción se realizó:
>>> 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 está en una transacción (get () le dará el objeto de resultado en la memoria sin consultar la base de datos):
>>> session.query(User).get(1) <User(u'ed', u'Ed Jones')>
mejor usar esto:
>>> 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',)
fuente
get()
parece darle el objeto de resultado en la memoria (sin consultar realmente la base de datos), perofilter().first()
siempre consultará la base de datos.get
es mejor usarlo debido al aumento de la eficiencia.get
es más eficiente.Si lo usa
tables reflection
, puede tener problemas con las soluciones proporcionadas. (Las soluciones anteriores aquí no funcionaron para mí).Lo que terminé usando fue:
session.query(object._class_).get(id)
(
object
se recuperó por reflexión de la base de datos, es por eso que debe usar.__class__
)Espero que esto ayude.
fuente
Primero, debe establecer
id
como clave principal.Luego, podría usar el
query.get()
método para consultar objetos por losid
que ya es la clave principal.Desde el
query.get()
método para consultar objetos por clave primaria.Inferido de la documentación 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)
fuente