Alguém poderia explicar a diferença entre filter
e filter_by
funções no SQLAlchemy? Qual devo usar?
python
sqlalchemy
bodacydo
fonte
fonte
db.users.name=='Ryan'
avaliaria uma vez uma constante e depois não teria sentido a partir de então? Parece que seria necessário usar um lambda para que isso funcionasse.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. uma consulta comoid=12345
,query(users).filter(id == id)
não será filtradausers.id
. Em vez disso, ele avaliaráid == id
comoTrue
e retornará todos os usuários. Você precisa usar.filter(users.id == id)
(como demonstrado acima). Eu cometi esse erro hoje cedo.Na verdade, nós os fundimos originalmente, ou seja, havia um método semelhante ao "filtro" que aceitava
*args
e**kwargs
, onde você podia passar uma expressão SQL ou argumentos de palavras-chave (ou ambos). Na verdade, acho isso muito mais conveniente, mas as pessoas sempre ficaram confusas com isso, pois geralmente ainda estão superando a diferença entrecolumn == expression
ekeyword = expression
. Então nós os separamos.fonte
column == expression
vs.keyword = expression
é o ponto chave a ser feito sobre a diferença entrefilter
efilter_by
. Obrigado!filter_by
poderia ser um pouco mais rápido quefilter
.filter_by
é ser capaz de escrever apenas o nome do campo, para essa classe, sem perguntas - emboraflter
exija o objeto da coluna real - que normalmente exige que você digite (e leia) pelo menos um nome de classe redundante. Portanto, se alguém deseja filtrar por igualdade, é bastante conveniente.filter_by
usa argumentos de palavra-chave, enquanto quefilter
permite argumentos de filtragem python comofilter(User.name=="john")
fonte
É um açúcar de sintaxe para uma gravação mais rápida de consultas. Sua implementação em pseudocódigo:
Para AND, você pode simplesmente escrever:
btw
pode ser escrito como
Além disso, você pode obter objetos diretamente por PK através do
get
método:Ao usar o
get
caso, é importante que o objeto possa ser retornado sem a solicitação do banco de dados a partir daidentity map
qual pode ser usado como cache (associado à transação)fonte
users.filter
da resposta anterior. E pode ser que seja minha culpa :) Oquery
atributo é query_property e é um açúcar bastante comum hoje em dia