2008-12-31 15 views
0

désolé pour ma question précédente qui était très ambigu, mais je pense que si je reçois la réponse à cette question, je peux y arriver. 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 du réfrigérateur) correspondent aux codes à barres dans une autre table (produits), définissez le champ de stock égal à 0. Le problème est que le programme essaie de faire correspondre tous les codes à barres trouvés dans la requête contre les codes à barres uniques dans la table des produits (c'est ce que je pense). Est-ce que quelqu'un sait quoi faire? merci un million. Lincoln.en utilisant les résultats d'une requête sql dans un programme python dans une autre requête sql

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) 
+0

vous auriez pu corriger/éditer votre question précédente en place. –

+0

Votre dossier de questions indique clairement que vous essayez d'apprendre à programmer. Si c'est vrai, SO n'est pas le bon endroit pour vous! Essayez d'obtenir les bases en premier avec des tutoriels et des livres qui sont mieux adaptés à cet effet. – hop

+0

Pour python, je recommande: www.greenteapress.com/thinkpython/thinkCSpy.pdf Pour les bases de données et SQL il y a: http://www.amazon.com/SQL-Practical-Developers-Kaufmann-Management/dp/0122205316/ref= sr_1_1? ie = UTF8 & s = livres & qid = 1230764439 & sr = 8-1 (http://tinyurl.com/86f56o) – hop

Répondre

5
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 à la question, mais exactement 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]) 
+0

Cet exemple a fonctionné .. juste besoin de deux points après 'pour row in rows'. Peut-être parce que le message ci-dessus datait de 2008 (ancienne version de Python?). – Ville

4

Ceci est plus de requête SQL que Python, mais je vais essayer de répondre que: (je ne l'ai pas travaillé avec MySQL mais PostgreSQL, donc il pourrait y avoir légère variation dans l'interprétation des choses ici).

lorsque vous avez

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

la variable 'rangée' est maintenant un resultset (comprendre: une liste de lignes de la base de données) quelque chose comme [(barcode1), (barcode2), (barcode3) ..]

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)..] 

qui n'est pas une instruction SQL correcte.

vous devriez faire quelque chose comme ceci:

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 ajouter plus vous avez un db.commit() après une requête de sélection et pas après une requête de mise à jour, c'est une faute de base. Select est idempotent, n'a pas besoin de validation, contrairement à Update. Je vous recommande fortement de passer par SQL avant de continuer.

+0

Il suffit de lire votre dernière question et ses réponses, les commentaires à nouveau. Je ne suis pas sûr que les deux choses: «ce que vous avez l'intention de faire» et «ce que vous pensez mener à cette fin» sont en cohérence.Je vais suggérer de relire les commentaires sur la dernière question et de reconsidérer ce qui se passe exactement. –

Questions connexes