Я пытаюсь получить конкретное значение из таблицы 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, а не в виде списка?
Пароль не должен храниться в базе данных в открытом виде. Его следует хешировать, обычно с помощью sha-256.
Я использую ССМС
Это очень простой проект, на этот раз не нужно хешировать.
Вы не можете. 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")
Предложение 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 символов.
How can I retrieve from the database only the value 5555 in this case, but not in a list format?
pyodbc поддерживает метод .fetchval(), который возвращает одно скалярное значение:
count = cursor.execute('select count(*) from users').fetchval()
имя dbms пожалуйста