Python sqlite3: actualice todos los registros con la suma del parámetro pasado y el valor del campo actual

Python sqlite3: actualice todos los registros con la suma del parámetro pasado y el valor del campo actual

Intentando actualizar todos los registros con la suma de cada valor de campo existente más un parámetro que se pasa. Si el campo en el registro A = 4 y el registro B = 5, quiero actualizar todos los registros para que A = 4 + X y B = 5 + X. De esta manera puedo incrementar rápidamente todos los valores de los registros en un número determinado (X). Hasta ahora no puedo entender cómo hacer que la declaración de actualización expanda el parámetro que se pasa.

Puedo agregar valor codificado con esta línea: c.execute("UPDATE level SET sell = sell + 1;")El siguiente código funciona como está. Pero cuando intento pasar un valor con la línea update_sell(1)y def update_sell(margin):hacer referencia al valor pasado así, c.execute("UPDATE level SET sell = sell + margin;")falla. ¿Que me estoy perdiendo aqui?

Novato total de Python aquí.

Script a ejecutar:

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

clase:

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

Respuesta1

Creo que te estás olvidando :de la función de actualización. Esto funciona para mí.

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

información relacionada