Восстановление определенного значения из БД с помощью pyodbc

#python #sql #database #pyodbc

#python #sql #База данных #pyodbc

Вопрос:

Я пытаюсь получить конкретное значение из таблицы SQL с помощью pyodbc в Python. В таблице dbo.passes есть 2 столбца: ('user_name','password') со значениями ('test','5555') . У меня есть следующий код:

 cursor.execute("SELECT password FROM [dbo].[passes] where user_name ='test'")
for row in cursor.fetchall():
    print (row)

passw = input("enter pass ")
if passw == row: 
    print ("nice")
else:
    print ("wrong")
  

Если мой ввод 5555 не соответствует «строке», потому что он выглядит как ('5555 ')

Как я могу извлечь из базы данных только значение 5555 в этом случае, но не в формате списка?

Комментарии:

1. пожалуйста, назовите СУБД

2. Пароль не должен храниться в базе данных. Оно должно быть хэшировано, обычно с помощью sha-256.

3. Я использую SSMS

4. Это очень простой проект, на этот раз нет необходимости хэшировать.

Ответ №1:

Вы не можете. SQL, по замыслу, возвращает кортежи. Получите доступ к вашему значению списка в python, что-то вроде этого:

 cursor.execute("SELECT password FROM [dbo].[passes] where user_name ='test'")
for row in cursor.fetchall():
    print (row)

passw = input("enter pass ")
if passw == row['password']: # Could also be row[0], idk you have to try
    print ("nice")
else:
    print ("wrong")
  

Ответ №2:

Предложение row [0] сработало, только немного отличается:

 cursor.execute("SELECT RTRIM (password) FROM [dbo].[passes] where user_name = 'test'")
for row in cursor.fetchall():
    print (row)

sqlpass = row[0]
print (sqlpass)

passw = input("enter pass ")
if passw == sqlpass: 
    print ("nice")
else:
    print ("wrong")
  

RTRIM необходим, поскольку поле представляет собой varchar(20), а возвращаемая строка представляет собой сохраненную строку плюс любое количество пробелов, чтобы получить до 20 символов.

Ответ №3:

Как я могу извлечь из базы данных только значение 5555 в этом случае, но не в формате списка?

pyodbc поддерживает .метод fetchval(), который возвращает одно скалярное значение:

 count = cursor.execute('select count(*) from users').fetchval()