Eu preciso consultar um banco de dados SQLAlchemy por id
algo 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 id
algo 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 id
seja.
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 reflection
poderá 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)
( object
foi recuperado por reflexão do banco de dados, é por isso que você precisa usar .__class__
)
Eu espero que isso ajude.
Primeiro, você deve definir id
como a chave primária.
Então você poderia usar o query.get()
método para consultar objetos pelos id
quais 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)