Найти - Пользователи
Полная версия: Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?
Начало » Python для новичков » Какой тип подставлять в sqlite, чтобы провести проверку на вхождение?
1
Gosha777
Всех приветствую! Возникла такая проблема. Есть база, в которой точно есть имена 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')

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

Подскажите, пожалуйста, как решить мою проблему?
vic57
 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)
py.user.next
  
>>> 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',)]
>>>
JOHN_16
Лучше делать как сказал py.user.next - это и универсально и безопасно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB