Python

Sqlite3 python ошибка: Error user-defined function raised exception

 import sqlite3 
import hashlib
import random


def md5sum(t):
return hashlib.md5(t).hexdigest()



def reg():
name = input("Name: ")
age = int(input("Age: "))
s = int(input("S: "))
login = input("Login: ")
password = input("Password: ")

try:
db = sqlite3.connect("database.db")
cursor = db.cursor()

db.create_function("md5", 1, md5sum)

cursor.execute("SELECT login FROM users WHERE login = ?", [login])
if cursor.fetchone() is None:
values = [name, age, s, login, password]
cursor.execute("INSERT INTO users(name, age, s, login, password) VALUES(?, ?, ?, ?, md5(?))", values)
# print(cursor.fetchone())
db.commit()
else:
print("Такой логин уже существует!")
reg()
except sqlite3.Error as e:
print("Error", e)
finally:
cursor.close()
db.close()

Выдаёт ошибку: Error user-defined function raised exception
Насколько я понял проблема в md5(?). Не знаю что делать
Ошибка "user-defined function raised exception" в SQLite3 обычно указывает на то, что пользовательская функция (в вашем случае, это функция md5) вызывает исключение.

В данном случае проблема может быть в функции `md5sum`, которая вызывается внутри SQLite. Эта функция принимает строку в формате байтов, а вы, похоже, передаете ей обычную строку. Это может быть источником ошибки, так как функция `hashlib.md5()` ожидает на вход данные в формате байтов, а не строки.

Вы можете попробовать преобразовать ваши входные данные в байты перед передачей их в функцию `hashlib.md5()`.

Исправленная функция `md5sum` выглядит так:

```python
def md5sum(t):
return hashlib.md5(t.encode()).hexdigest()
```

В этой версии функции строка `t` преобразуется в байты с помощью метода `encode()` перед передачей в `hashlib.md5()`.
Асхат Мулдагалиев
Асхат Мулдагалиев
14 368
Лучший ответ
Один из возможных способов решения проблемы с ошибкой “user-defined function raised exception” при использовании функции md5 в SQLite3 - это приведение аргумента функции к типу BLOB. Вот пример кода, который может помочь исправить ошибку:
 cursor.execute("INSERT INTO users(name, age, s, login, password) VALUES(?, ?, ?, ?, md5(?))", [name, age, s, login, sqlite3.Binary(password.encode())]) 
В этом примере аргумент функции md5 приводится к типу BLOB с помощью метода encode() и конструктора sqlite3.Binary(). Это может помочь решить проблему с ошибкой “user-defined function raised exception” при использовании функции md5 в SQLite3. Попробуйте обновить свой код и проверить, решит ли это проблему.
X5
Xaxa 55
25 860
Похоже, что ошибка происходит из-за вызова пользовательской функции `md5sum` внутри SQL-запроса. Ошибка может возникать из-за некорректного использования функции или передаваемых параметров.

Для исправления этой ошибки, вам необходимо изменить способ вызова функции `md5sum` в SQL-запросе. Вместо этого вы можете использовать встроенную функцию SQLite `hex` для получения значения хэша в формате шестнадцатеричной строки.

Вот как можно исправить ваш код:

```python
def reg():
name = input("Name: ")
age = int(input("Age: "))
s = int(input("S: "))
login = input("Login: ")
password = input("Password: ")

try:
db = sqlite3.connect("database.db")
cursor = db.cursor()

cursor.execute("SELECT login FROM users WHERE login = ?", [login])
if cursor.fetchone() is None:
values = [name, age, s, login, password]
cursor.execute("INSERT INTO users(name, age, s, login, password) VALUES(?, ?, ?, ?, hex(md5(?)))", values)
db.commit()
else:
print("Такой логин уже существует!")
reg()
except sqlite3.Error as e:
print("Error", e)
finally:
cursor.close()
db.close()
```

Теперь вместо вызова пользовательской функции `md5sum`, мы использовали встроенную функцию SQLite `hex`, чтобы получить значение хэша в формате шестнадцатеричной строки.
Иван Новиков
Иван Новиков
7 877