использование результатов запроса SQL в программе Python в другом запросе SQL - PullRequest
0 голосов
/ 31 декабря 2008

извините за мой предыдущий вопрос, который был очень неоднозначным, но я думаю, что если я получу ответ на этот вопрос, я смогу решить его. В приведенной ниже программе я выбрал штрих-коды продуктов, количество которых меньше количества. Я хочу сказать, что, если штрих-коды (в таблице холодильника) совпадают со штрих-кодами в другой таблице (продукты), установите поле запаса равным 0. Проблема, которую я получаю, состоит в том, что программа пытается сопоставить все найденные штрих-коды в запросе против отдельных штрих-кодов в таблице продуктов (вот что я думаю). Кто-нибудь знает что делать. бесконечно благодарен. линкольн.

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)

Ответы [ 2 ]

5 голосов
/ 31 декабря 2008
UPDATE products SET stock = 0 WHERE barcode IN ( 
    SELECT fridge.barcode FROM fridge WHERE fridge.amount < fridge.quantity );

Я знаю, что это не дает точного ответа на вопрос, но два оператора SQL не требуются.

Чтобы сделать это в 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])
4 голосов
/ 31 декабря 2008

Это больше SQL-запрос, чем Python, но все же я постараюсь ответить на него: (Я не работал с MySQL, но с PostgreSQL, поэтому здесь возможны небольшие различия в интерпретации).

когда вы сделали

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

переменная 'row' теперь является результирующим набором (чтобы понять: список строк из базы данных) что-то вроде [(штрих-код1), (штрих-код2), (штрих-код3) ..]

при выполнении оператора обновления

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

это превращается во что-то вроде:

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

, который не является правильным оператором SQL.

вы должны сделать что-то вроде этого:

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

или лучше, оптимизированная вещь:

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()

Ну, чтобы добавить больше, у вас есть db.commit () после запроса select, а не после запроса обновления, это основная ошибка. Select является идемпотентом, не требует фиксации, тогда как Update делает. Я настоятельно рекомендую вам пройтись по SQL, прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...