SQLite/Python数据库检索与比较
目前,我有一个包含用户名、密码等的数据库。 我想查一下数据库,看看是否有重复的SQLite/Python数据库检索与比较,python,sqlite,Python,Sqlite,目前,我有一个包含用户名、密码等的数据库。 我想查一下数据库,看看是否有重复的 con = lite.connect('userInfo.db') with con: cur = con.cursor() cur.execute("SELECT * FROM Users WHERE LOWER(Username) = LOWER(?)", (newID,)) rows = cur.fetchall() if len(rows)!=0: return
con = lite.connect('userInfo.db')
with con:
cur = con.cursor()
cur.execute("SELECT * FROM Users WHERE LOWER(Username) = LOWER(?)", (newID,))
rows = cur.fetchall()
if len(rows)!=0:
return "Duplicate detected"
这是我目前的代码newID
是一个新名称,我希望检查数据库中是否存在同名的现有条目
我的问题是——我在代码中这样做是一个好主意吗?我主要关心我的方法。我是否应该使用除fetchall()
之外的其他内容
谢谢你抽出时间!:)
请注意,这是针对网站应用程序的。
为什么不将SQLite中的字段设置为唯一,这将首先防止重复条目。
这里有一种方法可以完全满足您的要求-找出给定的
用户名是否已经存在:
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
因为您只需要一个计数
就足够了
但实际上,您不应该自己强制实现用户名的唯一性。通过将字段指定为唯一
或主键
,让数据库为您执行此操作
如果您尝试插入“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
顺便说一句,使用大写/小写函数时要非常小心。“Гааааааааааааааааа
既然您提到这是针对Web应用程序的,我就提醒您将密码存储为(绝不是纯文本!),并通过使用用于SQL查询的(?,?,?,?,?,…)
占位符来防止SQL注入,而不是(%s,%s)%(var1,var2)
字符串插值方法
引述:
通常,SQL操作需要使用Python中的值
变量。您不应该使用Python的字符串组合查询
因为这样做是不安全的;它使你的程序
易受SQL注入攻击
相反,使用DB-API的参数替换。放?作为一个
在需要使用值的任何位置使用占位符,然后提供元组
作为游标的execute()方法的第二个参数的值。
(其他数据库模块可能使用不同的占位符,例如%s或%s。)
:1.)例如:
如果您不这样做,那么有人可以请求用户名Robert Menzies;删除表用户
with.如果检测到重复条目,会发生什么情况?@Vincent如果将用户名column设置为唯一,并且使用现有用户名插入用户表,则会导致失败。e、 从一开始就不会有任何重复。那么我的程序本质上会“崩溃”吗?对不起,我是新来的,刚开始做编码。非常感谢您的帮助。您将得到一个SQLite3.OperationalError
,上面写着“出了问题”。如果可以合理预期重复的用户名,您可以使用try。。。除了
阻塞和恢复。如果一开始就不应该尝试重复用户名,那么崩溃是正常的。而且username
字段实际上应该是PRIMARY KEY
。也就是说,使用一个单独的用户id整数主键自动递增
和用户名文本唯一
可能是一种更好的方法-这样,用户名
中的奇怪字符就不会引起错误(您的代码是否正确处理用户名“Гаааааааааааааа用户可以随意更改用户名(因为它没有被用作任何其他地方的密钥)。为了节省内存,考虑用<代码> FECTONE()/代码>替换<代码> FETRAG()/<代码>。谢谢您的详细解释。非常感谢。只是出于好奇,robertmenzies;删除表用户代码>实际做什么以及为什么?丹!实际上,名称应该是robertmenzies);删除表用户代码>。然后,如果您的查询类似于“插入用户值(%s)”%username
,那么在变量替换之后,您将有“插入用户值”(Robert Menzies);DROP TABLE users;
-这会将Robert Menzies
插入users
表,然后删除整个users
表。这称为SQL注入攻击,这是可能的,因为;
字符结束SQL命令并开始新的命令。您必须做的事情之一是转义;
>用户输入中的字符,这样就不会发生这种情况。在sqlite3
文档中使用建议的做法-(?,?,?…)
占位符,可以防止这种攻击和其他攻击。哦!非常有趣。谢谢。
try:
conn.execute("""INSERT INTO users (username, email)
VALUES ("Alice", "alice@wonderland.com");""")
except sqlite3.IntegrityError:
print ("Username 'Alice' was already taken.")