Mapa SQL cru para vários modelos do Django relacionados

votos
2

Devido a razões de desempenho não pode usar os métodos de consulta ORM do Django e eu tenho que usar SQL cru para algumas questões complexas. Eu quero encontrar uma maneira de mapear os resultados de uma consulta SQL para vários modelos.

Eu sei que posso usar a seguinte instrução para mapear os resultados da consulta a um modelo, mas eu não consigo descobrir como usá-lo para ser capaz de mapear para os modelos relacionados (como eu pode fazer usando a instrução select_related em Django).

model_instance = MyModel(**dict(zip(field_names, row_data)))

Existe uma maneira relativamente fácil de ser capaz de mapear os campos de tabelas relacionadas que também estão no conjunto de resultados de consulta?

Publicado 17/04/2009 em 10:52
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Primeiro, você pode provar a ORM está parando o seu desempenho? Às vezes, problemas de desempenho são de design de banco de dados simplesmente pobres, ou índices impróprios. Geralmente isso vem tentando forçá-fit ORM do Django em um projeto de banco de dados legado. procedimentos armazenados e gatilhos pode ter um impacto adverso sobre o desempenho - especialmente quando se trabalha com Django onde se espera que o código de gatilho para estar no modelo de código Python.

Às vezes o mau desempenho é um problema de aplicação. Isto inclui operações com encomendas por desnecessárias sendo feito no banco de dados.

O problema de desempenho mais comum é uma aplicação que "over-busca" de dados. Casualmente usando o .all()método e criar grandes coleções na memória. Isto irá esmagar o desempenho. Os conjuntos de consulta Django tem que ser tocado tão pouco quanto possível, para que o iterador conjunto consulta é dada para o modelo para exibição.

Uma vez que você optar por ignorar o ORM, você tem que lutar o problema objeto-relacional diferença de impedância. Novamente. Especificamente, "navegação" relacional não tem noção de "relacionado": tem que ser um de primeira classe buscar de um conjunto relacional usando chaves estrangeiras. Para montar um modelo de objeto complexo em memória via SQL é simplesmente difícil. referências circulares fazer isso muito difícil; resolver FK em coleções é difícil.

Se você estiver indo para usar SQL cru, você tem duas escolhas.

  1. Abster-se "selecione relacionado" - ela não existe - e é dolorosa para implementar.

  2. Inventar o seu próprio ORM-como "selecionar relacionadas" características. Uma abordagem comum é adicionar getters stateful que (a) verificar uma cache privada para ver se eles buscar o objeto relacionado e se o objeto não existe, (b) buscar o objeto relacionado a partir do banco de dados e atualizar o cache.

No processo de inventar suas próprias getters stateful, você poderá reinventar Django, e você provavelmente vai descobrir que não é a camada ORM, mas um projeto de banco de dados ou um problema de design do aplicativo.

Respondeu 17/04/2009 em 12:54
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more