#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 дня подряд