#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()