Python sqlite3: Alle Datensätze werden mit der Summe der übergebenen Parameter und dem aktuellen Feldwert aktualisiert

768
primohacker

Beim Versuch, alle Datensätze mit der Summe jedes vorhandenen Feldwerts plus einem übergebenen Parameter zu aktualisieren. Wenn das Feld in Datensatz A = 4 und Datensatz B = 5 ist, möchte ich alle Datensätze aktualisieren, dh A = 4 + X und B = 5 + X. Auf diese Weise kann ich alle Datensatzwerte schnell um eine bestimmte Zahl (X) erhöhen. Bis jetzt kann ich nicht herausfinden, wie ich mit der Aktualisierungsanweisung den übergebenen Parameter erweitern kann.

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, einen Wert mit der Zeile an update_sell(1)zu übergeben def update_sell(margin):und den so übergebenen Wert zu referenzieren, c.execute("UPDATE level SET sell = sell + margin;")schlägt dies fehl. Was fehlt mir hier?

Total Python Noob hier.

Skript zum Ausführen:

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

1 Antwort auf die Frage

1
codykochmann

Ich denke, Sie vergessen :die Update-Funktion. Das funktioniert für mich.

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}) 
Genial! danke @codykochmann. Das hat funktioniert. primohacker vor 7 Jahren 0
Warum wird `{" margin ": margin}` benötigt? primohacker vor 7 Jahren 0
Margin musste noch in die vorbereitete SQL-Anweisung eingefügt werden. Sie haben die Anweisung erstellt, {'margin': margin} weist SQLites api an, diese Variable sicher in die SQL zu injizieren, damit sie verarbeitet werden kann. codykochmann vor 7 Jahren 1