我认为值将是正确的词。如果没有请编辑。
内容:
问题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()
答案 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?这将引发相同的错误,这次将无法处理,并使程序崩溃。
坚持第一种方法会更好。除非确实确实需要,否则请不要使用全局变量。