Сохранение два раза в базу данных

Я изучаю sqlite3, как сделать так, чтобы при прописке playe имя ещё раз не создавалось в таблице?

вот мой не рабочий код:

import sqlite3

connect = sqlite3.connect("Stats.db")
cursor = connect.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS player(
    name TEXT,
    cash INT,
    level INT
)""")
connect.commit()

playe = input("Ваш никнэйм: ")
balance = 10
leve = 0

def start():
    print(f"\nНачать(/p)\nНастройки(/n)\nНовости(/w)")

cursor.execute(f"SELECT name FROM player WHERE name = {playe}")
if cursor.fetchone() is None:
    cursor.execute("INSERT INTO player VALUES(?,?,?);", (playe, balance, leve))
    connect.commit()
    start()
else:
    start()

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

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

Для того чтобы не было дубликатов в таблице нужно:

  • на уровне БД создать уникальный констрейнт
  • в бизнес логики использовать апсерт с последующим апдейтом или исключением
→ Ссылка
Автор решения: gil9red

Действия:

  • Исправил ошибку, которая приводит к тому, что всегда при запуске добавляется игрок. Причина в проверке cursor.fetchone() is None без предварительного вызова SELECT
  • Добавил уникальность поля name (нужно будет удалить таблицу/базу данных, либо через запрос руками добавить уникальность)

Пример:

import sqlite3

connect = sqlite3.connect("Stats.db")
cursor = connect.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS player(
    name TEXT UNIQUE,
    cash INT,
    level INT
)
""")
connect.commit()

playe = input("Ваш никнэйм: ")
balance = 10
leve = 0

def start():
    print(f"\nНачать(/p)\nНастройки(/n)\nНовости(/w)")

cursor.execute("SELECT name FROM player WHERE name = ?", [playe])

# Если игрока нет в базе
if not cursor.fetchone():
    cursor.execute("INSERT INTO player VALUES(?,?,?);", (playe, balance, leve))
    connect.commit()

start()
→ Ссылка