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ó]
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ó]
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.
YourModel.query.get((pk1, pk2))
. Observe la tupla.
Puede consultar a un usuario con id = 1 como este
session.query(User).get(1)
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',)
get()
parece darle el objeto de resultado en la memoria (sin consultar realmente la base de datos), pero filter().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.
Primero, debe establecer id
como clave principal.
Luego, podría usar el query.get()
método para consultar objetos por los id
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)