Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Django] Reutiliser la plus petite id disponible

Sujet résolu
    14 février 2013 à 12:37:16

    Bonjour,

    Je cherche un moyen pour spécifier automatiquement l'id d'un objet que je créer mais sans auto-incrémentation.

    Par exemple si je créer 3 objets, l'id de mon prochain objet sera probablement 4, mais si je supprime l'objet ayant l'id 2, je souhaiterais réutiliser cet id (2) au lieu du 4 lors de la creation d'une nouvelle entrée.

    Avez vous des pistes pour résoudre mon problème.

    Merci d'avance 

    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2013 à 13:15:37

      Quelle est l'utilité de faire ça ?

      Tu peux éventuellement faire quelque chose dans ce gout là :

      ids = [m['id'] for m in Model.objects.values('id').order_by('id')]
      for i in xrange(ids):
          id = i + 1
          if ids[i] != id:
              break
      

      Mais ça consomme beaucoup de ressources pour rien....

      -
      Edité par PyTony 14 février 2013 à 13:32:19

      • Partager sur Facebook
      • Partager sur Twitter
      Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
        14 février 2013 à 13:36:09

        Pour m’entraîner je fais un système de "short url" ayant une durée d'utilisation limitée et donc une fois le temps écoulé je supprime l’entrée, ce qui fait que j'ai des sortes de "trou" dans ma base, mais comme tu le dis ça consomme pas mal de ressources.  

        Merci tout de même pour ton exemple. 

        • Partager sur Facebook
        • Partager sur Twitter
          14 février 2013 à 13:39:45

          Il n'y a pas de "trous" dans ta base. Le fait d'avoir des ids non consécutifs n'est absolument pas un problème.

          Baryum a écrit:

          mais comme tu le dis ça consomme pas mal de ressources.&nbsp

          Le problème n'est pas tant que ça consomme pas mal de ressources, mais surtout que cette consommation est inutile.

          PS: En plus ça peut générer des risques de collision si deux entrées sont ajoutées en même temps:

          Requête 1: Quel est le plus petit ID dispo ? Serveur SQL : C'est 4 Requête 2: Quel est le plus petit ID dispo ? Serveur SQL : C'est 4 Requête 2: OK Je vais insérer mon truc à l'ID 4 alors. Serveur SQL : OK Requête 1: OK Je vais insérer mon truc à l'ID 4 alors. Serveur SQL : Attends qu'est ce que tu fous là, c'est n'importe quoi j'ai déjà un truc à l'ID 4 moi !

          Ces risques peuvent être évités en utilisant des mécanismes comme les verrous par exemple. Mais bon, puisque le SGBD se charge de tout ça pour nous, pourquoi le faire à sa place.

          -
          Edité par PyTony 14 février 2013 à 13:48:29

          • Partager sur Facebook
          • Partager sur Twitter
          Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!

          [Django] Reutiliser la plus petite id disponible

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown