Python sqlite3: Aktualisieren Sie alle Datensätze mit der Summe der übergebenen Parameter und des aktuellen Feldwerts

Python sqlite3: Aktualisieren Sie alle Datensätze mit der Summe der übergebenen Parameter und des aktuellen Feldwerts

Ich versuche, alle Datensätze mit der Summe aller vorhandenen Feldwerte plus einem übergebenen Parameter zu aktualisieren. Wenn das Feld in Datensatz A = 4 und Datensatz B = 5 ist, möchte ich alle Datensätze so aktualisieren, dass A = 4 + X und B = 5 + X ist. Auf diese Weise kann ich alle Datensatzwerte schnell um eine bestimmte Zahl (X) erhöhen. Bisher habe ich nicht herausgefunden, wie ich die Update-Anweisung dazu bringen kann, den übergebenen Parameter zu erweitern.

Ich kann mit dieser Zeile einen fest codierten Wert hinzufügen: c.execute("UPDATE level SET sell = sell + 1;")Der folgende Code funktioniert so wie er ist. Aber wenn ich versuche, mit der Zeile einen Wert zu übergeben und auf update_sell(1)diese def update_sell(margin):Weise auf den übergebenen Wert zu verweisen, c.execute("UPDATE level SET sell = sell + margin;")schlägt dies fehl. Was übersehe ich hier?

Totaler Python-Neuling hier.

Auszuführendes Skript:

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

Klasse:

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

Antwort1

Ich glaube, Sie vergessen :die Update-Funktion. Bei mir funktioniert das.

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

verwandte Informationen