Как выполнить проверку, что запись в БД уже существует?

Как выполнить проверку на существование записи, которую пытаюсь добавить в БД?

Пишу как в документации, проводил небольшой дебаг, но всё равно, при попытке добавить уже существующую запись в БД, она успешно добавляется.

Вот сам код:

import sqlite3

db = sqlite3.connect('test.db')
sql = db.cursor()

sql.execute("""create table if not exists players(
   nick text,
   score integer
)""")
db.commit()

nick = input()
score = int(input())

sql.execute("select nick from players where nick = '{nick}'")
select = sql.fetchone()

if select is None:
   sql.execute(f'insert into players(nick, score) values (?, ?)', (nick, score))
   db.commit()

   print('Successfully done!')
else:
   print('Sorry...')

for value in sql.execute('select * from players'):
   print(value)

Ответы (1 шт):

Автор решения: MaxU

Правильнее будет создать первичный ключ (primary key) в таблице, чтобы SQLite сам проверял записи на уникальность и обернуть вставку записей в try - except блок:

import sqlite3

def add_player(nick, score):
    try:
        cur.execute(f'insert into players(nick, score) values (?, ?)', (nick, score))
    except sqlite3.IntegrityError:
        pass


db = sqlite3.connect('test.db')
cur = db.cursor()

cur.execute("""create table if not exists players(
   nick text,
   score integer,
   constraint pk_players primary key (nick)
)""")

nick, score = "max", 123

add_player(nick, score)
add_player(nick, score)
add_player(nick, score)

Проверка:

In [375]: cur.execute("select * from players")
Out[375]: <sqlite3.Cursor at 0x7ff584317030>

In [376]: print(list(cur.fetchall()))
[('max', 123)]
→ Ссылка