Flask-SQLAlchemy-SQLite: Не удается обработать объект GUID на стороне сервера — Ошибка значения: неправильно сформированная шестнадцатеричная строка UUID

#python #sqlite #flask #sqlalchemy #datatables

Вопрос:

Я работаю над небольшим приложением Flask, в котором у меня есть модель sqlite, и отображаю эти данные с помощью таблиц данных и jquery. Я реализовал подход на стороне сервера для фильтрации, поиска и разбиения на страницы. Теперь я хотел изменить идентификатор каждой таблицы на объект GUID с помощью модуля uuid.uuid4 (). Но когда я это делаю, мой файл обработки на стороне сервера выдает ошибки:

   File "C:Userss1056280Projectsdevprojappmodelsmodel.py", line 41, in process_bind_param
    return "%.32x" % uuid.UUID(value).int
  File "C:Userss1056280AppDataLocalProgramsPythonPython39Libuuid.py", line 177, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string

  File "C:Userss1056280Projectsdevprojappviewsqueries.py", line 17, in load_projects
    returnTable = ProjectsDataTable(request, Projects).output_result()
  File "C:Userss1056280Projectsdevprojapputiltable_queries.py", line 15, in __init__
    self.run_query()
  File "C:Userss1056280Projectsdevprojapputiltable_queries.py", line 56, in run_query
    self.cardinality_filtered = db.session.query(func.count(str(self.model_object.id))) 

  File "C:Userss1056280Projectsdevprojappmodelsmodel.py", line 41, in process_bind_param
    return "%.32x" % uuid.UUID(value).int
  File "C:Userss1056280AppDataLocalProgramsPythonPython39Libuuid.py", line 177, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
sqlalchemy.exc.StatementError: (builtins.ValueError) badly formed hexadecimal UUID string
[SQL: SELECT count(?) AS count_1
FROM projects
WHERE projects.id LIKE ? OR projects.title LIKE ? OR projects.description LIKE ? OR projects.created_date LIKE ?
 LIMIT ? OFFSET ?]
[parameters: [immutabledict({})]]

 

Мой скрипт python на стороне сервера выглядит следующим образом:

 class ProjectsDataTable:
    def __init__(self, request, model_object):
        self.request = request
        self.model_object = model_object
        self.cardinality = 0
        self.cardinality_filtered = 0
        self.results = None
        self.run_query()

    def output_result(self):
        output = {}
        output["sEcho"] = int(self.request.args.get('sEcho'))
        output["iTotalRecords"] = self.cardinality
        output["iTotalDisplayRecords"] = self.cardinality_filtered
        output["aaData"] = self.results
        return output

    def run_query(self):
        self.cardinality = self.model_object.query.count()
        #get columns name from request
        column_count = int(self.request.args.get('iColumns'))
        column_list = []
        for i in range(column_count):
            column_name = self.request.args.get('mDataProp_%d' % i)
            column_list.append(column_name)

        #filtering
        search_value = self.request.args.get('sSearch')
        filter_list = []
        if search_value != "":
            for col in column_list[:-1]:
                column_type = getattr(getattr(self.model_object, col), 'type')
                print(column_type)
                if not isinstance(column_type, db.DateTime):
                    filter_list.append(getattr(self.model_object, col).like("%"   search_value   "%"))

        #sorting
        order_column_index = int(self.request.args.get('iSortCol_0'))
        order_column = getattr(self.model_object, column_list[order_column_index])
        order_dir = self.request.args.get('sSortDir_0')
        order_object = getattr(order_column, order_dir)()

        #paging
        start = self.request.args.get('iDisplayStart', 0, type=int)
        length = self.request.args.get('iDisplayLength', 1, type=int)

        items = self.model_object.query.filter(or_).order_by(order_object) 
                    .offset(start).limit(length).all()
        self.cardinality_filtered = db.session.query(func.count(self.model_object.id)) 
                    .filter(or_).order_by(None).first()
        self.results = [i.projects_table_to_json for i in items]
 

the model class itself looks like this:

 from fastapi_utils.guid_type import GUID, GUID_DEFAULT_SQLITE

class Projects(db.Model):
    __tablename__ = 'projects'
    id = Column(GUID, primary_key=True, default=GUID_DEFAULT_SQLITE)
    title = Column(String(100), unique=False, nullable=False)
    description = Column(String(500), unique=False, nullable=False)
    date = Column(Integer, unique=False, nullable=False)
    experiments = relationship("Experiments", backref='project', lazy=True)

    def __init__(self, title, description, created_date):
        self.title = title
        self.description = description
        self.date= date
        
    @property
    def projects_table_to_json(self):
        return {
            'id': str(self.id),
            'title': self.title,
            'description': self.description,
            'date': self.date,
        }
 

Каким-то образом у меня возникла логическая ошибка при объявлении и заполнении моего списка filter_list. При преобразовании идентификатора GUID в строку все работает нормально, но это может как-то не работать с самим идентификатором GUID. Он хранится в виде символа(32) в моей базе данных sqlite.

Я уже пробовал разные модули uuid, а также самостоятельно писал — но все имело одно и то же значение ошибки: плохо сформированная шестнадцатеричная строка UUID.

У кого-нибудь есть идея? Я был бы так благодарен, если бы сидел уже 2 дня подряд