带有多个参数的Python sqlite select查询返回错误消息

时间:2015-07-23 00:39:32

标签: python sqlite

我有一个包含3列(id,username,password)的sqlite表。表格中有一行。我正在尝试运行sqlite查询以选择用户名和密码与用户输入的内容匹配的ID。我的login.py代码如下:

import sqlite3 as lite


def login(userinput, userpass):
con = lite.connect('console.db')

with con:
    cur = con.cursor()
    cur.execute("SELECT id FROM users WHERE username == :userinput & password == :userpass", {"userinput": userinput, "userpass": userpass})
    con.commit()
    row = cur.fetchone()
    print row[0]

我的main.py代码如下:

import login
from getpass import getpass
import hashlib


username = raw_input("username >>")
password1 = getpass("password >>")
password1 = hashlib.sha224(password1).hexdigest()
login.login(username, password1)

我收到如下错误消息:

Traceback (most recent call last):
  File "/home/wip/PycharmProjects/console/main.py", line 9, in <module>
    login.login(username, password1)
  File "/home/wip/PycharmProjects/console/login.py", line 12, in login
    print row[0]
TypeError: 'NoneType' object has no attribute '__getitem__'

存储在表格中的密码使用sha224加密存储,就像用户在提示时输入密码一样。任何有关这方面的帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您的查询未返回任何行,因此fetchone()将返回None。

尝试在查询中使用and代替&

cur.execute("SELECT id FROM users WHERE username == :userinput and password == :userpass", {"userinput": userinput, "userpass": userpass})

我认为==通常不是有效的SQL,因此您应该使用=代替。

另一件事是,您无需为选择查询调用commit()