Проверьте, существует ли имя пользователя или нет в python при регистрации - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу проверить, существует ли имя пользователя в таблице или нет. Код работает, когда я выбираю все из таблицы, но я получаю сообщение об ошибке, когда пытаюсь использовать только имя пользователя. Получаемая ошибка:

Файл "\ Python \ Python37 \ lib \ tkinter__init __. Py", строка 1705, в вызов , возврат self.fun c (* args)

Файл /Calculator_calorie/login_register.py " , строка 89, в create

login_backend.insert(self.namere_text.get(),self.passwordr1e_text.get())

File \ Calculator_calorie \ login_backend.py ", строка 18, во вставке

if cur.execute('SELECT name FROM user WHERE name = ?',(name)):

sqlite3.ProgrammingError: Указано неверное количество привязок. В текущем операторе используется 1, а есть 4.

import sqlite3
from tkinter import *
from tkinter import messagebox
from user import user

def connect():
    conn=sqlite3.connect("login.db")
    cur=conn.cursor()
    cur.execute("CREATE TABLE if NOT exists user(name text,password text)")
    conn.commit()
    conn.close()



def insert(name,password):
    conn=sqlite3.connect('login.db')
    cur = conn.cursor()
    if cur.execute('SELECT * FROM user WHERE name = ?', (name)):
        if cur.fetchone():
          messagebox.showinfo('Error', 'User already exist')
        else:
           cur.execute('INSERT INTO user VALUES(?,?)', (name, password))
           messagebox.showinfo('Register', 'Entry sucess')


    conn.commit()
    conn.close()




def create(self):
         if self.passwordr1e.get() != self.passwordr2e.get():
             messagebox.showinfo('error','Passwords do not match')
         elif len(self.namere.get()) == 0:
             messagebox.showinfo('error', 'Name field is empty')

         elif len(self.passwordr1e.get()) == 0:
               messagebox.showinfo('error', 'PASSWORD field is empty')

         else:
             login_backend.insert(self.namere_text.get(),self.passwordr1e_text.get())

1 Ответ

1 голос
/ 12 февраля 2020

Как прокомментировал Майкл , для Python, чтобы распознать кортеж с одним значением, в конце нужна запятая. (name,) не (name). См. W3Schools Python Tuples .

if cur.execute('SELECT name FROM user WHERE name = ?',(name,)):

Обратите внимание, что если вы просто проверяете, существует ли строка, select 1, чтобы сэкономить немного времени.


Однако есть более безопасный и быстрый способ сделать это.

Как прокомментировал Крис , проверяя пользователя и вставляя, если он не содержит условия гонки . Если два процесса пытаются создать одного и того же пользователя в одно и то же время, они оба решат, что его там нет, и оба процесса вставят, что приведет к дублированию.

     Proc 1                                       Proc 2
t    SELECT * FROM user WHERE name = ?
i                                                 SELECT * FROM user WHERE name = ?
m    0 records found
e                                                 0 records found
|    INSERT INTO user VALUES(?,?)
v                                                 INSERT INTO user VALUES(?,?)

Вместо этого установите уникальное ограничение, выполните insert и поймайте уникальную ошибку.

CREATE TABLE if NOT exists user(
  name text unique not null,
  password text not null
)

def insert(name,password):
    conn=sqlite3.connect('login.db')
    cur = conn.cursor()

    try:
        cur.execute('INSERT INTO user VALUES(?,?)', (name, password))
        messagebox.showinfo('Register', 'Entry sucess')
    except sqlite3.IntegrityError as e:
        if re.match(r'UNIQUE constraint failed', e.args[0]):
            messagebox.showinfo('Error', 'User already exist')
        else:
            raise e

    conn.commit()
    conn.close()

Проверка наличия и вставки в одном запросе называется «atomi c», поскольку две части не могут быть


Заметки

Запись SQL от руки хороша для обучения, но для производственной работы используйте такие рамки, как SQL Алхимия .

Хранение паролей в виде простого текста небезопасно. Используйте библиотеку хеширования паролей, такую ​​как bcrypt , и прочитайте хеширование паролей .

Повторное подключение к базе данных для каждого запроса неэффективно. Подключитесь один раз и оставьте соединение открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...