2012-09-28 1 views
0

Tout d'abord, désolé s'il s'avère que ce que j'essaie de faire est la fissure de fumée ici, je ne suis en aucun cas un expert DB ou SQLA. =)SQLAlchemy, filtrage des requêtes jointes avec l'héritage de table

J'ai deux classes, Personne et Organisation, qui utilisent l'héritage de table pour hériter de Contact. (Person.id est un fkey à Contact.id), qui fonctionne bien.

Je souhaite effectuer une recherche dans un champ de recherche et obtenir une liste de tous les contacts. Normalement, quand je suis après une série de choses, je fais ceci:

def build_query(self): 
  return self.session.query(Person) 

def filter_query(self, query) 
    if self.search_form_values.get('name_last',None): 
        query = query.filter(
      Person.name_last==self.search_form_values.get('name_last') 
     ) 
    ... 
    return query 

Et puis ailleurs la requête est exécuté. Le problème est que je veux récupérer une liste d'objets contact, mais je veux filtrer sur Organization.name, Person.name_last, et Person.name_first, tous à partir des valeurs tapées dans la case 'nom' de la recherche forme. Je n'arrive pas à comprendre comment faire cela avec une requête, je ne sais pas si c'est possible. Je voudrais cependant éviter d'avoir deux requêtes séparées avec des résultats entrelacés.

Y a-t-il du kung fu filtrant qui me permettrait de faire ce qui précède? à savoir

  • retourner tous les contacts:
    • ont name_last ou name_first match si le contact est une personne
    • avoir match de nom, si le contact est une organisation

Remerciements

Iain

Répondre

0

Je pense que ce n'est pas facilement réalisable en SQL du tout. Une requête SQL unique ne peut renvoyer qu'un nombre fixe de colonnes et chaque ligne doit avoir toutes les mêmes colonnes. Votre personne et votre organisation sont évidemment différentes.

Bien sûr, vous pouvez toujours renvoyer une union de colonnes de deux tables, en définissant des colonnes inexistantes dans un enregistrement particulier à null. Je ne pense pas que les objets SQLAlchmey seraient faciles à recréer à partir de ces données. Je ne dis pas que c'est impossible, mais je parierais 10 $ c'est impraticable.

Si j'étais vous, je préfèrerais utiliser deux requêtes, fusionner les résultats, et voir si les performances sont suffisamment mauvaises pour en prendre soin.

Bien sûr, l'extraction et la fusion de deux requêtes rendent la sortie paginée difficile. Si je me souciais tellement de la réactivité de la recherche, je pourrais envisager de récupérer des enregistrements excessifs et de les mettre en cache dans la RAM ou dans une table temporaire, liée à une requête de recherche particulière (par exemple, son hachage). Peu d'utilisateurs ayant besoin de plus de 2 ou 3 pages devront attendre que de lourdes requêtes soient exécutées, mais la plupart des utilisateurs seront servis rapidement.

Questions connexes