Python SQLite удалить, где значение "Нет" - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно удалить записи БД, где значение может быть None.Я получаю свои значения из ListBox.Функция выглядит так:

    def OnDelete(self, e): 
    num = self.list.GetItemCount()
    for i in range(num):
        if self.list.IsChecked(i):
            itemValueList = []
            for i2 in range(6):
                item = self.list.GetItem(i, i2)

                if item.GetText() == "None":
                    itemValueList.append("")
                else:
                    itemValueList.append(item.GetText()) 

    DBManager.DeleteEntry(itemValueList)

И функция в моем DBManager выглядит следующим образом:

def DeleteEntry(itemValueList):
    # Open Database
    conn = sqlite3.connect('Database.db')
    c = conn.cursor()
    # Delete a row of data
    c.execute('delete from Database where Value1=? and Value2=? and Value3=? and Value4=? and Value5=? and Value6=?',  
              (itemValueList[0], itemValueList[1], itemValueList[2], itemValueList[3], itemValueList[4], itemValueList[5]))

    # Save (commit) the changes
    conn.commit()

Так что в моем случае Value5 и Value6 равны «None» или NULLв БД SQLite.Поэтому я установил строку, добавленную в itemValueList, равной "".Но это не работает.БД Entriy не удаляется.

Что мне нужно изменить, чтобы также удалялись записи, в которых некоторые столбцы не могут иметь значения?

Спасибо.

[РЕДАКТИРОВАТЬ]:

c.execute('delete from Database where isnull(Value1,"")=? and isnull(Value2,"")=? and isnull(Value3,"")=? and isnull(Value4,"")=? and isnull(Value5,"")=? and isnull(Value6,"")=?',  
          (itemValueList[0], itemValueList[1], itemValueList[2], itemValueList[3], itemValueList[4], itemValueList[5]))

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

См. Что эквивалентно нулевому безопасному оператору равенства <=> в SQLite? .Вы должны использовать оператор IS вместо = в своем запросе, и он будет соответствовать значению NULL.

Затем вам нужно изменить код, чтобы использовать Python None вместопустой строки.Это будет переведено в SQL NULL в подготовленном операторе.

            if item.GetText() == "None":
                itemValueList.append(None)
            else:
                itemValueList.append(item.GetText())
0 голосов
/ 06 февраля 2019

В SQL (и особенно в SQLite) значение NULL не совпадает с пустой строкой.Таким образом, установка строки в itemValueList в пустую строку не имеет смысла.Вам нужно будет изменить ваш SQL-запрос, чтобы разрешить значение NULL, например:

delete
  from Database
 where     Value1=?
       and Value2=?
       and Value3=?
       and Value4=?
       and Value5 is null
       and Value6=?

И использовать эту форму запроса, если значение Value5 равно None, или вам необходимо преобразовать значения NULL.на пустую строку:

delete
  from Database
 where     isnull(Value1,'') =?
       and isnull(Value2,'') =?
       and isnull(Value3,'') =?
       and isnull(Value4,'') =?
       and isnull(Value5,'') =?
       and isnull(Value6,'') =?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...