IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQLite Discussion :

Apprentissage de SQLlte


Sujet :

SQLite

  1. #1
    Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Points : 56
    Points
    56
    Par défaut Apprentissage de SQLlte
    Bonjour,
    j'utilise sqlite3 avec python 3.4 sous windows.
    je suis en pleine découverte d'utilisation de base de donnée, et j'ai pour projet d'améliorer mon programme de recette déjà créé avec python.
    après avoir pas mal parcouru de tuto, j'aimerai vous exposer mon problème de l'instant, car je pense qu'il y en aura d'autre !!!
    j'ai créé 3 tables :
    - recette qui contient la catégorie (pâte, crème...), et le nom
    - produit qui contient le nom du produit et son prix
    - ingrédient qui permet de stocker la recette.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    dico_table = {"recette" :
                        [("id_r", "INTEGER", "PRIMARY KEY NOT NULL",),
                        ("categorie_r", "VARCHAR(30)",),
                        ("nom_r", "VARCHAR(60)",)
                        ],
                        "produit" :
                        [("id_p", "INTEGER", "PRIMARY KEY NOT NULL",),
                        ("nom_p", "VARCHAR(60)",),
                        ("prix_p","REAL",)
                        ],
                        "ingredient":
                        [("id_r", "INTEGER",),
                        ("id_p", "INTEGER",),
                        ("poids_i", "REAL",)
                        ]
                        }
    j'ai créé des index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        cur.execute("CREATE UNIQUE INDEX idx_nom_produit ON produit (nom_p)")
        cur.execute("CREATE INDEX idx_recette ON recette (categorie_r, nom_r)")
        cur.execute("CREATE INDEX idx_ingredient ON ingredient (id_r, id_p)")
    je remplis mes tables pour l'exemple :
    produit : (1, 'sel', 2.15)
    produit : (2, 'sucre', 5.63)
    produit : (3, 'farine', 0.66)
    recette : (1, 'pâte', 'sucrée')
    recette : (2, 'créme', 'amande')
    ingredient : (1, 1, 0.01)
    ingredient : (1, 2, 0.5)
    ingredient : (2, 2, 2.0)
    ingredient : (2, 3, 2.0)

    voici le cœur du problème : je lance une requête voulant sélectionner la recette crème d'amande qui contient du sucre et de la farine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    self.cur.execute("""SELECT recette.categorie_r,
                        recette.nom_r,
                        produit.nom_p,
                        produit.prix_p,
                        ingredient.poids_i
                        FROM ingredient
                        JOIN recette
                        JOIN produit
                        WHERE
                        recette.id_r = 2""")
            l = self.cur.fetchall()
            for a in l:
                print(a)
    et voici mon résultat :
    ('créme', 'amande', 'sel', 2.15, 0.01)
    ('créme', 'amande', 'sucre', 5.63, 0.01)
    ('créme', 'amande', 'farine', 0.66, 0.01)
    ('créme', 'amande', 'sel', 2.15, 0.5)
    ('créme', 'amande', 'sucre', 5.63, 0.5)
    ('créme', 'amande', 'farine', 0.66, 0.5)
    ('créme', 'amande', 'sel', 2.15, 2.0)
    ('créme', 'amande', 'sucre', 5.63, 2.0)
    ('créme', 'amande', 'farine', 0.66, 2.0)
    ('créme', 'amande', 'sel', 2.15, 2.0)
    ('créme', 'amande', 'sucre', 5.63, 2.0)
    ('créme', 'amande', 'farine', 0.66, 2.0)

    que ce passe t'il ? mon résultat est multiplié
    merci pour vos explications, ma structure n'est pas bonne ? ou la requête n'est pas correct ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Cela ressemble un peu à un produit cartésien... Sans doute parce qu'il manque les conditions de jointure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  ...
    FROM    ingredient
        JOIN 
            recette
            ON  ingredient.id_r = recette.id_r
        JOIN 
            produit  
            ON  ingredient.id_p = produit.id_p
    ...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Effectivement, votre résultat s'explique par l'absence de critères de jointures

    Si vous voulez améliorer votre gestion des recettes, il faudrait tenir compte du fait que tout ingrédient ne se mesure pas en poids (ou plutôt en masse), mais parfois en volume, ou autre unité de mesure (cuillère à café, pincée etc...). Et même en masse, l'unité peu changer (1 kg de pomme de terres, mais 50g de beurre par exemple)
    Il est donc préférable d'avoir 2 attributs : un pour la quantité, l'autre pour l'unité de mesure de la quantité

    Si vous voulez pouvoir connaitre facilement la liste des recettes que vous pouvez faire avec un certain ingrédient (tiens, il me reste de la farine de maïs, qu'est ce que je pourrais bien préparer avec ça...) alors un deuxième index sur la table ingrédient serait utile, avec l'identifiant produit en 1er : CREATE INDEX idx2_ingredient ON ingredient (id_p, id_r) .

  4. #4
    Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    merci beaucoup à tous les deux, je n'avais pas vu qu'il fallait des conditions dans les jointures

    Si vous voulez pouvoir connaitre facilement la liste des recettes que vous pouvez faire avec un certain ingrédient (tiens, il me reste de la farine de maïs, qu'est ce que je pourrais bien préparer avec ça...) alors un deuxième index sur la table ingrédient serait utile, avec l'identifiant produit en 1er : CREATE INDEX idx2_ingredient ON ingredient (id_p, id_r) .
    si j'ai bien compris cet index permet la recherche sur le produit et ensuite la recette que celui que j'ai créé exécute la recherche sur la recette et le produit ensuite.

    Si vous voulez améliorer votre gestion des recettes, il faudrait tenir compte du fait que tout ingrédient ne se mesure pas en poids (ou plutôt en masse), mais parfois en volume, ou autre unité de mesure (cuillère à café, pincée etc...). Et même en masse, l'unité peu changer (1 kg de pomme de terres, mais 50g de beurre par exemple)
    Il est donc préférable d'avoir 2 attributs : un pour la quantité, l'autre pour l'unité de mesure de la quantité
    Effectivement j'ai pas mal d'idée pour améliorer mon programme et les unités en font parties, mais aussi créer une table catégorie, fournisseur pour les produits, familles pour les produits (économat, BOF, Surgelé...), méthode et images ou croquis...

    je vais faire un model et le soumettrais à la communauté Merise ou autre ?
    ensuite je me lancerai dans la conception, requête, etc...

    autre chose comme je voudrais lié des recettes dans les recettes, il faut que je crée un niveau : recette de base, intermédiaire, finale et la ça se corse !!!

    donc vous risquez de me voir encore quelques fois

    je passe le message en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. apprentissage non supervisé .......
    Par ratbert dans le forum Statistiques, Data Mining et Data Science
    Réponses: 7
    Dernier message: 22/02/2008, 12h23
  2. Contrat d'apprentissage
    Par bartmarley dans le forum Emploi
    Réponses: 6
    Dernier message: 08/07/2004, 18h04
  3. Apprentissage
    Par le Daoud dans le forum Intelligence artificielle
    Réponses: 6
    Dernier message: 01/04/2004, 16h21
  4. apprentissage du C est-il necessaire pour C++ ?
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 02/05/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo