Eu preciso consultar um banco de dados SQLAlchemy por idalgo semelhante a
User.query.filter_by (username = 'peter')
mas para id. Como eu faço isso? [Pesquisar no Google e no SO não ajudou]
Eu preciso consultar um banco de dados SQLAlchemy por idalgo semelhante a
User.query.filter_by (username = 'peter')
mas para id. Como eu faço isso? [Pesquisar no Google e no SO não ajudou]
Respostas:
Query tem uma função get que oferece suporte a consultas pela chave primária da tabela, o que presumo que idseja.
Por exemplo, para consultar um objeto com ID 23:
User.query.get(23)
Observação: como alguns outros comentaristas e respostas mencionaram, isso não é simplesmente uma abreviatura para "Executar uma filtragem de consulta na chave primária". Dependendo do estado da sessão SQLAlchemy, a execução deste código pode consultar o banco de dados e retornar uma nova instância ou pode retornar uma instância de um objeto consultado anteriormente em seu código sem realmente consultar o banco de dados. Se ainda não o fez, considere a leitura da documentação na Sessão SQLAlchemy para entender as ramificações.
YourModel.query.get((pk1, pk2)). Observe a tupla.
Você pode consultar um usuário com id = 1 como este
session.query(User).get(1)
get () não é o esperado às vezes:
se sua transação foi feita:
>>> 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')>
se você estiver em uma transação (get () fornecerá o objeto de resultado na memória sem consultar o banco de dados):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
melhor usar isso:
>>> 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 dar-lhe o objeto de resultado na memória (sem realmente consultar o banco de dados), mas filter().first()sempre consultará o banco de dados.
geté melhor devido ao aumento da eficiência.
geté mais eficiente.
Se você usar, tables reflectionpoderá ter problemas com as soluções fornecidas. (As soluções anteriores aqui não funcionaram para mim).
O que acabei usando foi:
session.query(object._class_).get(id)
( objectfoi recuperado por reflexão do banco de dados, é por isso que você precisa usar .__class__)
Eu espero que isso ajude.
Primeiro, você deve definir idcomo a chave primária.
Então você poderia usar o query.get()método para consultar objetos pelos idquais já é a chave primária.
Desde o query.get()método para consultar objetos pela chave primária.
Inferido da documentação 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)