如何将字符串与数据库中的值匹配

时间:2018-10-10 01:38:46

标签: python database python-3.x sqlite passwords

我认为值将是正确的词。如果没有请编辑。

内容:

问题1(字符串未永久保留在数据库中)

问题2(问题1的想法)

我正在创建一个程序,该程序使用Python3中的Sqlite3将字符串添加到数据库的表中。我正在使用一个功能,要求您输入密码。以后,如果输入的字符串等于数据库中的任何内容,想调用该函数。(如果它不等于数据库中的任何内容,则将其插入密码表中。)

问题1:

问题是当我停止运行该程序并再次运行它时,该字符串没有保留在数据库中,这导致它允许我重新输入以前的密码。我想要执行的程序是使字符串在停止后保留在数据库中。
这是上面段落的程序:(向下滚动以解决问题1

import sqlite3
import hashlib

db  = sqlite3.connect( "users.db" )
cur = db.cursor()
cur.execute( "CREATE TABLE IF NOT EXISTS passwords( pwd TEXT, UNIQUE( pwd ))" )

def password():
  pwd = input( "password: " )
  sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
  cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))

while True:
  try:
    password()
    #break
  except KeyboardInterrupt:
    print( "aborted" )
    break
  except sqlite3.IntegrityError:
    print( "cannot reuse that password" )
db.commit()
db.close()

================================================ ======================= 问题2:(问题1的思想)

这里是更新版本。我在这里的操作是尝试将字符串添加到数据库表中,如果它与任何字符串匹配或不匹配。我在这里遇到的错误是pwd不是第13行上的变量,尽管我确实将其设为1并将其设置为全局变量。如果想在这个问题上提供帮助,我想知道为什么pwd不是变量,以及如何使其成为变量。

import sqlite3
import hashlib

db  = sqlite3.connect( "used_passwords.db" )
cur = db.cursor()
cur.execute( "CREATE TABLE IF NOT EXISTS passwords( pwd TEXT, UNIQUE( pwd ))" )

def password():
  global pwd
  pwd = input( "password: " ) #turn this into a global variable
  sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
  cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))

while True:
  #take pwd from password and put it here
  sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
  try:
    password()
    #break
  except KeyboardInterrupt:
    print( "aborted" )
    break
  except sqlite3.IntegrityError:
    print( "cannot reuse that password" )
    cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))
db.commit()
db.close()

1 个答案:

答案 0 :(得分:1)

对于问题1 ,将db.commit()移至循环中,或者将else移至try-except或直接移至password()函数中。

try:
  password()
except KeyboardInterrupt:
  print( "aborted" )
  break
except sqlite3.IntegrityError:
  print( "cannot reuse that password" )
else:
  db.commit()

def password():
  pwd = input( "password: " )
  sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
  cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))
  db.commit()

插入成功后,请分别提交,否则您可能会因未处理的错误而丢失所有插入。除了未提交的插入内容外,没有其他任何原因导致您的密码“不保留在数据库中”。

关于问题2 :当程序进入循环时,password()尚未被调用,因此pwd尚不存在。

while True:
  #take pwd from password and put it here
  sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()  # <-- pwd is undefined here ...
try:
    password()  # ... because it needs this to be executed at least once

为什么还要在循环中第二次hashlib.sha256?您已经在password中进行了操作;您可以从循环中删除该行并立即消除NameError。同样,循环的except块中的第二个INSERT没有意义。如果INSERT违反UNIQUE约束并引发IntegrityError,您是否再次尝试执行相同的INSERT?这将引发相同的错误,这次将无法处理,并使程序崩溃。

坚持第一种方法会更好。除非确实确实需要,否则请不要使用全局变量。