2017-08-29 2 views
1

Lors de la réalisation de mon projet, j'ai dû mettre à jour une donnée dans une autre donnée. J'ai essayé de supprimer les anciennes données existantes et d'insérer de nouvelles données, mais cette procédure change l'ordre des données, donc je ne veux pas ce genre de méthode.Comment résoudre une erreur lors de la mise à jour des données sqlite3 en Python?

Ce que j'essaie de faire est de trouver une donnée qui a des valeurs de old et de le remplacer par les valeurs dans new. Donc, c'est le code que je l'ai fait:

import sqlite3 

    old = ('Test1', 'Test2', 'Test3', 'Test4') 
    new = ('Test_1', 'Test_2', 'Test_3', 'Test_4') 

    conn = sqlite3.connect('TestDB') 
    c = conn.cursor() 

    c.execute("CREATE TABLE IF NOT EXISTS Test (Menu1 text, Menu2 text, Menu3 text, Menu4 text)") 
    conn.commit() 

    c.execute("INSERT INTO Test VALUES (?, ?, ?, ?)", old) 
    conn.commit() 

    c.execute("UPDATE Test SET Menu1 = ? and Menu2 = ? and Menu3 = ? and Menu4 = ? WHERE Menu1 = ? and Menu2 = ? and Menu3 = ? and Menu4 = ?", new + old) 
    conn.commit() 

    c.execute("SELECT * FROM Test") 
    print(c.fetchall()) 

Mais j'ai eu un problème de mise à jour de l'ensemble de données: le résultat du code était:

[('0', 'Test2', 'Test3', 'Test4')] 

Alors pourquoi diable suis-je avoir ce problème et comment puis-je résoudre ce problème? J'ai essayé de résoudre ce problème pendant des jours et je ne pouvais toujours pas résoudre le problème.

+0

Pouvez-vous essayer d'appeler 'conn.commit()' après la mise à jour? – bernie

+0

Oh, j'ai fait 'conn.commit()' mais j'ai manqué de l'écrire en postant. Merci quand même! –

+1

Vous utilisez 'and' dans la section' SET' de 'UPDATE', où vous devriez utiliser', '. 'UPDATE Test SET Menu1 =? , Menu2 =? , Menu3 =? , Menu4 =? OERE Menu1 =? et Menu2 =? et Menu3 =? et Menu4 =? ' –

Répondre

0

La déclaration UPDATE Test SET Menu1 = ? and Menu2 = ? and Menu3 = ? and Menu4 = ? WHERE Menu1 = ? and Menu2 = ? and Menu3 = ? and Menu4 = ? est faux. Il est analysé comme

  1. UPDATE, "Test", SET
  2. "Menu1", =, ?
  3. AND, "Menu2", =, ?
  4. AND ...
  5. . ...

Le AND dans 3. transforme l'ensemble de l'instruction commençant par 2. en une expression. Menu1 = ? AND Menu2 = ? ... est convertie en un booléen qui est True si le premier paramètre est "true-ish" et "Menu2" est égal au deuxième paramètre, et "Menu3" est égal au troisième paramètre et ainsi de suite. Le résultat de cette expression est False, qui est forcé dans le 0 que vous voyez.

La déclaration que vous voulez sans doute est quelque chose à la hauteur de

UPDATE Test SET Menu1 = ?, Menu2 = ?, .... WHERE Menu1 = ? ....