Python 如何查找变量的rowid?sqlite3
我正在使用sqlite制作一个用户名密码程序,我想检查数据库中是否有用户名(我已经这样做了),然后我想找到所述用户名的行id。这将是用户输入的用户名。我知道如何在数据库中找到单词的rowid,例如“word”。我怎样才能用一个变量替换这个词呢Python 如何查找变量的rowid?sqlite3,python,sqlite,rowid,Python,Sqlite,Rowid,我正在使用sqlite制作一个用户名密码程序,我想检查数据库中是否有用户名(我已经这样做了),然后我想找到所述用户名的行id。这将是用户输入的用户名。我知道如何在数据库中找到单词的rowid,例如“word”。我怎样才能用一个变量替换这个词呢 def sign_in(): usernameask = input("What is your username?") passwordask = input("What is your password?&
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(“从stuffToPlot中选择rowid,其中username='usernameask'”)
并希望将当前正在数据库中作为单词查找的'usernameask'
替换为变量。我该怎么做?
没有错误,它只找到数据库中不存在的单词“usernameask”的位置。您想使用参数化查询。将占位符放在查询中数据必须放在的位置,并让数据库驱动程序将数据和查询放在一起
通过参数化查询,您可以避免常见的安全隐患,即SQL注入攻击。在这种情况下,攻击者可以通过输入比您最初预期的更多的命令来“增强”您的数据库查询。查询参数始终确保数据仅作为数据处理,而不是作为命令处理
参数化查询通常也会更快,因为如果您多次使用它,它可以让数据库避免每次都要解析您的查询,而且它还可以重用查询计划
sqlite3
数据库库使用?
作为位置参数;将?
放在需要使用代码中数据的位置,并将参数值按顺序(如元组或列表)放在第二个参数中,以:
请注意,(usernameask,)
是一个包含一个元素的元组。您也可以使用[usernameask]
这将使用usernameask
在WHERE username=
过滤器中引用的字符串值执行SELECT
查询。驱动程序负责正确引用您的值
您还可以使用命名参数,其形式为:parametername
,(您可以在其中选择自己的名称),然后使用字典作为游标的第二个参数。execute()
,将名称映射到值:
t = c.execute(
"SELECT rowid, FROM stuffToPlot WHERE username = :username",
{'username': usernameask})
这里的占位符名为
username
,字典将其映射到usernameask
值。谢谢,这些都起作用了,无论我多么希望它只返回密码,出于某种原因,当您输入Sam时,它返回的('Sam','Sam','Sam'))
请注意,在数据库中,密码和用户名都是Sam,我尝试了fetchone(),但这不起作用,您如何使其仅返回密码,我还对其进行了一些更新以提高效率。更新的内容在主体中@Ghostly@SamboyT当前位置对不起,我不得不收回,你问的问题已经回答了。堆栈溢出的工作原理是为未来的访问者生成问题和答案。您现在有一个新问题。@SamboyT:您选择了password,*
,所以首先是password列,然后添加所有列。只需选择密码(删除*
),并从行中取出单个元素:password=c.fetchone()[0]
;这是获取第一个匹配行(仅一列),然后从该行中取出该列结果并将其分配给变量。
t = c.execute(
"SELECT rowid, FROM stuffToPlot WHERE username = :username",
{'username': usernameask})