Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 1, 2018 18:44:58

Gosha777
Зарегистрирован: 2017-05-12
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?

Всех приветствую! Возникла такая проблема. Есть база, в которой точно есть имена name1, name2 и name3, необходимо отфильтровать базу, чтобы достать все значения кроме этих.

Итак, что я пишу:

 with sqlite3.connect(data.sqlite') as conn:
    cursor = conn.cursor()
t = ('name1', 'name2', 'name3')
cursor.execute('''
SELECT Names
FROM NamesTable
WHERE Names NOT IN ?
''', t)    # (t,) или (t) тоже не помогает
cursor.fetchall()

При этом скрипт вроде этого в SQL отрабатывает нормально:
 SELECT Names
FROM NamesTable
WHERE Names NOT IN ('name1', 'name2', 'name3')

Я так понимаю, что я отправляю непрвильный тип данных в виде кортежа. Скорее всего необходимо отправлять как-то по-другому.

Подскажите, пожалуйста, как решить мою проблему?

Отредактировано Gosha777 (Янв. 1, 2018 19:04:07)

Офлайн

#2 Янв. 1, 2018 23:03:16

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?

 t = ('name1', 'name2', 'name3')
cursor.execute('''
SELECT Names
FROM NamesTable
WHERE Names != ? AND Names != ? AND Names != ?''', t)
#или так
sql = "SELECT Names FROM NamesTable WHERE Names NOT IN " + "('name1','name2,'name3')" 
cursor.execute(sql)

Отредактировано vic57 (Янв. 1, 2018 23:20:25)

Офлайн

#3 Янв. 2, 2018 13:17:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?

  
>>> import sqlite3
>>> 
>>> con = sqlite3.connect(':memory:')
>>> cur = con.cursor()
>>> cur.execute('create table NamesTable (Names text, Numbers integer)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> cur.execute('insert into NamesTable values ("name0", 0)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> cur.execute('insert into NamesTable values ("name1", 1)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> cur.execute('insert into NamesTable values ("name2", 2)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> cur.execute('insert into NamesTable values ("name3", 3)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> cur.execute('insert into NamesTable values ("name4", 4)')
<sqlite3.Cursor object at 0x7f2a2f812650>
>>> 
>>> t = ('name1', 'name2', 'name3')
>>> 
>>> cmd = """
... SELECT Names
... FROM NamesTable
... WHERE Names NOT IN ({})
... """.format(', '.join('?' * len(t)))
>>> 
>>> print(cmd)
 
SELECT Names
FROM NamesTable
WHERE Names NOT IN (?, ?, ?)
 
>>> 
>>> list(cur.execute(cmd, t))
[('name0',), ('name4',)]
>>>



Отредактировано py.user.next (Янв. 2, 2018 13:24:01)

Офлайн

#4 Янв. 2, 2018 22:34:13

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?

Лучше делать как сказал py.user.next - это и универсально и безопасно



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version