如何找到变量的rowid?sqlite3



我正在使用sqlite制作一个用户名密码程序,我想检查数据库中是否有用户名(我已经这样做了),然后我想找到所述用户名的行id。这将是用户输入的用户名。我知道如何在数据库中找到单词的rowid,例如"word"。我该如何制作is以便用变量替换单词?

def sign_in():
usernameask = input("What is your username?")
passwordask = input("What is your password?")
c.execute("SELECT username FROM stuffToPlot")
names = {name[0] for name in c.fetchall()} 
if usernameask in names:
print("Yes")
c.execute("SELECT password FROM stuffToPlot")
passs = {name[0] for name in c.fetchall()}
if passwordask in passs:
print("yes,pass")
t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ")
rowid = t.fetchall()
for r in rowid:
print(r)
else:
print("No,pass"

我正在看上面写着t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ")的地方并且想要将当前正在将其作为数据库中的单词查找的CCD_ 2替换为变量。我该怎么做?没有错误,它只是找到了单词"的位置;用户名询问";它不在数据库中。

您想要使用参数化查询。您将占位符放在查询中必须放置数据的位置,并将其留给数据库驱动程序来将数据和查询放在一起。

参数化查询可以避免常见的安全隐患,即SQL注入攻击,攻击者可以通过输入比您最初预期更多的命令来"增强"您的数据库查询。查询参数始终确保数据只作为数据处理,而不是作为命令处理。

参数化查询通常也会更快地,因为如果您多次使用它,它可以让数据库避免每次都解析您的查询,而且它还可以重用查询计划。

sqlite3数据库库使用?作为位置参数;将?放在需要使用代码中数据的位置,并将参数值按序列(如元组或列表)放在cursor.execute():的第二个参数中

t = c.execute("SELECT rowid, FROM stuffToPlot WHERE username = ?", (usernameask,))

注意,(usernameask,)是一个具有一个元素的元组。您也可以使用[usernameask]

这将使用usernameaskWHERE username =筛选器中引用的字符串值执行SELECT查询。司机会注意正确报价。

您也可以使用命名的参数,这些参数采用:parametername的形式(您可以在其中选择自己的名称),然后使用字典作为cursor.execute()的第二个参数,将名称映射到值:

t = c.execute(
"SELECT rowid, FROM stuffToPlot WHERE username = :username",
{'username': usernameask})

这里占位符被命名为username,字典将其映射到usernameask值。

最新更新