Как сопоставить строку со значением в базе данных - PullRequest
0 голосов
/ 10 октября 2018

Я думаю, что значение будет правильным словом.Пожалуйста, измените, если нет.

Содержание:

Задача 1 (строка не находится в базе данных постоянно)

Задача 2 (идея для задачи 1)

Я создаю программу, которая добавляет строку в таблицу в базе данных, используя Sqlite3 в Python3.Я использую функцию, которая запрашивает у вас пароль.Позже, желая вызвать функцию, если введенная строка равняется чему-либо в базе данных (если она не совпадает с чем-либо в базе данных, мы вставляем ее в таблицу паролей).

Проблема 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, хотя у меня она есть как единая и я установил ее как глобальную переменную.Если вы хотите помочь в решении этой проблемы, я хотел бы знать, почему 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 голосов
/ 10 октября 2018

Для задачи 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.Кроме того, второй INSERT в блоке except цикла не имеет смысла.Если INSERT нарушает УНИКАЛЬНОЕ ограничение и поднимает IntegrityError, вы пытаетесь повторить ту же самую INSERT снова?Это вызовет ту же ошибку, которая на этот раз не обрабатывается и приведет к аварийному завершению вашей программы.

Придерживайтесь вашего первого подхода, это намного лучше.Не используйте глобальные переменные, если вы действительно действительно ДЕЙСТВИТЕЛЬНО не должны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...