Python sqlite3: обновить все записи с суммой переданного параметра и текущего значения поля

631
primohacker

Попытка обновить все записи с суммой каждого существующего значения поля плюс передаваемый параметр. Если поле в записи A = 4 и запись B = 5, я хочу обновить все записи, чтобы A = 4 + X и B = 5 + X. Таким образом, я могу быстро увеличить все значения записи на заданное число (X). До сих пор я не могу понять, как получить оператор обновления для расширения передаваемого параметра.

Я могу добавить жестко закодированное значение с этой строкой: c.execute("UPDATE level SET sell = sell + 1;")Код ниже работает как есть. Но когда я пытаюсь передать значение с линией update_sell(1)до def update_sell(margin):и ссылаться на значение, передаваемое как так, c.execute("UPDATE level SET sell = sell + margin;")он терпит неудачу. Что мне здесь не хватает?

Общий питон нуб здесь.

Скрипт для запуска:

#MainScript.py import sqlite3 from LevelClass import level  conn = sqlite3.connect(':memory:') c = conn.cursor()  c.execute("""CREATE TABLE level ( buy integer, sell integer, quan integer )""")  def insert_level(level): with conn: c.execute("INSERT INTO level VALUES (:buy, :sell, :quan)", {'buy': level.buy, 'sell': level.sell, 'quan': level.quan})  def get_level_by_sell(sell): c.execute("SELECT * FROM level WHERE sell=:sell", {'sell': sell}) return c.fetchall()  def update_sell(margin): with conn: # below works with "sell + 1", but fails with "sell + margin" c.execute("UPDATE level SET sell = sell + 1;")  trans_1 = level(1, 5, 50) trans_2 = level(2, 10, 60)  insert_level(trans_1) insert_level(trans_2)  # value to pass to update_sell as var "margin" update_sell(1)  find = get_level_by_sell(6) print(find)  find = get_level_by_sell(11) print(find)  conn.close() 

учебный класс:

# saved as LevelClass.py class level: def __init__(self, buy, sell, quan): self.buy = buy self.sell = sell self.quan = quan  def __repr__(self): return "Level('{}', '{}', {})".format(self.buy, self.sell, self.quan) 
0

1 ответ на вопрос

1
codykochmann

Я думаю, что вы забыли :для функции обновления. Это работает для меня.

def update_sell(margin): with conn: # below works with "sell + 1", but fails with "sell + margin" #c.execute("UPDATE level SET sell = sell + 1") c.execute("UPDATE level SET sell = sell + :margin", {"margin":margin}) 
Потрясающие! спасибо @codykochmann. Это сработало. primohacker 7 лет назад 0
Зачем нужно `{" margin ": margin}`? primohacker 7 лет назад 0
Маржу все еще нужно было вставить в подготовленный оператор SQL. У вас есть встроенный оператор, {'margin': margin} указывает SQLites api безопасно вводить эту переменную в sql, чтобы ее можно было обработать. codykochmann 7 лет назад 1