Вот способ сделать именно то, что вы просили - узнать, существует ли данный username
:
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute ("""
CREATE TABLE users (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE,
email TEXT UNIQUE );
""")
test_users = (
{'username':"Alice", 'email':"Alice@mail.com"},
{'username':"Billy", 'email':"Billy@mail.com"},
{'username':"Charles", 'email':"Charles@mail.com"},
{'username':"Dick", 'email':"Dick@mail.com"},
{'username':"Emily", 'email':"Emily@mail.com"},
{'username':"Faramir", 'email':"Faramir@mail.com"},
)
for user in test_users:
conn.execute("INSERT INTO users (username, email) VALUES (?,?)",
(user['username'],user['email'])
)
result = conn.execute("SELECT COUNT(*) FROM users WHERE username='Alice'")
number_of_Alices = result.next()[0] # number_of_Alices will be 1
Поскольку все, что вам нужно, это COUNT
, то этого достаточно.
На самом деле, вы не должны сами обеспечивать уникальность имен пользователей. Позвольте базе данных сделать это за вас, указав в качестве поля либо UNIQUE
, либо PRIMARY KEY
.
Если вы попытаетесь вставить "Alice", "alice@wonderland.com"
после создания базы данных, как описано выше, вы получите sqlite3.IntegrityError:
>>> conn.execute("""INSERT INTO users (username, email)
... VALUES ("Alice", "alice@wonderland.com");""")
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
sqlite3.IntegrityError: column username is not unique
Чтобы обнаружить это, попробуйте запустить INSERT
и определить, не работает ли он.
try:
conn.execute("""INSERT INTO users (username, email)
VALUES ("Alice", "alice@wonderland.com");""")
except sqlite3.IntegrityError:
print ("Username 'Alice' was already taken.")
Кстати, будьте очень осторожны с использованием функций верхнего / нижнего регистра. "Главное в новостях".lower()
означает, что вы думаете, что значит?
Поскольку вы упоминаете, что это для веб-приложения, я просто напомню, что вы должны хранить ваши пароли как соленые хэши паролей, используя уникальные соли для каждого пользователя (никогда как обычным текстом!) и защититься от внедрения SQL с помощью заполнителей (?,?,?,?,...)
для запросов SQL, а не (%s,%s) % (var1, var2)
метода интерполяции строк.
Цитировать документацию sqlite3 :
Обычно для ваших операций SQL нужно использовать значения из Python
переменные. Вы не должны собирать ваш запрос, используя строку Python
операции, потому что это небезопасно; это делает вашу программу
уязвимы для атаки SQL-инъекцией.
Вместо этого используйте подстановку параметров DB-API. Положил ? как
заполнитель везде, где вы хотите использовать значение, а затем предоставить кортеж
значений в качестве второго аргумента метода execute () курсора.
(Другие модули базы данных могут использовать другой заполнитель, такой как% s или
: 1.) Например:
Если вы этого не сделаете, кто-то может запросить имя пользователя Robert Menzies; DROP TABLE users;
с веселыми результатами .