Как прокомментировал Майкл , для 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 , и прочитайте хеширование паролей .
Повторное подключение к базе данных для каждого запроса неэффективно. Подключитесь один раз и оставьте соединение открытым.