Python 如何查找变量的rowid?sqlite3

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?&

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

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})