如何找到变量的rowid? sqlite3的

时间:2017-10-30 10:18:41

标签: python sqlite rowid

我正在使用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("SELECT rowid, FROM stuffToPlot WHERE username = 'usernameask' ") 并且想要将当前正在查找它的'usernameask'替换为变量中的单词。我该怎么办? 没有错误,它只是在数据库中找到“usernameask”这个词的位置。

1 个答案:

答案 0 :(得分:1)

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

参数化查询可以避免常见的安全隐患, SQL注入攻击,攻击者可以通过输入比您原先预期更多的命令来“扩充”数据库查询。查询参数始终确保您的数据仅作为数据处理,而不是作为命令处理。

参数化查询我们通常也更快,因为它允许数据库避免每次多次使用它时解析查询,并且它还可以重用查询计划。

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

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

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

这将使用SELECT过滤器中usernameask引用的字符串值执行您的WHERE username =查询。司机负责正确引用您的价值。

您还可以使用命名的参数,这些参数采用:parametername的形式,(您可以选择自己的名称),然后使用字典作为{的第二个参数{1}},将名称映射到值:

cursor.execute()

此处占位符名为t = c.execute( "SELECT rowid, FROM stuffToPlot WHERE username = :username", {'username': usernameask}) ,字典将其映射到username值。