0 votes

utilisation des résultats d'une requête sql dans un programme python dans une autre requête sql

Désolé pour ma question précédente qui était très ambiguë, mais je pense que si je trouve la réponse à cette question, je pourrai la résoudre. Dans le programme ci-dessous, j'ai sélectionné les codes-barres des produits dont le montant est inférieur à la quantité. Je veux dire que si les codes barres (dans la table réfrigérateur) correspondent aux codes barres d'une autre table (produits), le champ stock doit être égal à 0. Le problème que je rencontre est que le programme essaie de faire correspondre tous les codes barres qu'il a trouvés dans la requête avec les codes barres uniques de la table produits (c'est ce que je crois).

import MySQLdb

def order():
    db = MySQLdb.connect(host='localhost', user='root', passwd='$$', db='fillmyfridge')
    cursor = db.cursor()
    cursor.execute('select barcode from fridge where amount < quantity')
    db.commit()
    row = cursor.fetchall()
    cursor.execute('update products set stock = 0 where barcode = %s', row)

5voto

Adam Peck Points 3000
UPDATE products SET stock = 0 WHERE barcode IN ( 
    SELECT fridge.barcode FROM fridge WHERE fridge.amount < fridge.quantity );

Je sais que cela ne répond pas exactement à la question mais deux instructions SQL ne sont pas nécessaires.

Pour le faire en python :

import MySQLdb

def order():
    db = MySQLdb.connect(host='localhost', user='root', passwd='$$', db='fillmyfridge')
    cursor = db.cursor()
    cursor.execute('select barcode from fridge where amount < quantity')
    db.commit()
    rows = cursor.fetchall()
    for row in rows
        cursor.execute('update products set stock = 0 where barcode = %s', row[0])

4voto

JV. Points 1296

Il s'agit plus d'une requête SQL que Python, mais je vais quand même essayer de répondre à cette question : (Je n'ai pas travaillé avec MySQL mais avec PostgreSQL, donc il peut y avoir une légère variation dans l'interprétation des choses ici).

quand vous l'avez fait

cursor.execute('select barcode from fridge where amount < quantity')
db.commit()
row = cursor.fetchall()

la variable 'row' est maintenant un jeu de résultats (pour comprendre : une liste de lignes de la base de données) quelque chose comme [(code barre1), (code barre2), (code barre3)..]

quand vous faites la déclaration de mise à jour

cursor.execute('update products set stock = 0 where barcode = %s', row)

cela se transforme en quelque chose comme :

update products set stock = 0 where barcode = [(barcode1), (barcode2), (barcode3)..]

ce qui n'est pas une instruction SQL correcte.

vous devriez faire quelque chose comme ça :

cursor.execute('update products set stock = 0 where barcode in (%s)', ','.join([each[0] for each in row]))

ou mieux, la chose optimisée :

import MySQLdb

def order():
    db = MySQLdb.connect(host='localhost', user='root', passwd='$$', db='fillmyfridge')
    cursor = db.cursor()
    cursor.execute('update products set stock = 0 where barcode in (select barcode from fridge where amount < quantity)')
    db.commit()

Eh bien, pour en rajouter, vous avez un db.commit() après une requête select et pas après une requête update, c'est une erreur de base. Select est idempotent, n'a pas besoin de commit, alors que Update en a besoin. Je vous recommande fortement de passer par le SQL avant de continuer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X