Сохранение два раза в базу данных
Я изучаю 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()