如何解决Flask-SQLAlchemy-SQLite:无法处理 GUID 对象服务器端 - ValueError:格式错误的十六进制 UUID 字符串
我正在开发一个小 Flask 应用程序,在那里我有一个 sqlite 模型并使用数据表和 jquery 显示这些数据。我实现了一种用于过滤、搜索和分页的服务器端方法。现在我想使用 uuid.uuid4() 模块将每个表的 id 更改为 GUID 对象。但是当我这样做时,我的服务器端处理文件抛出错误:
File "C:\Users\s1056280\Projects\dev\proj\app\models\model.py",line 41,in process_bind_param
return "%.32x" % uuid.UUID(value).int
File "C:\Users\s1056280\AppData\Local\Programs\Python\python39\Lib\uuid.py",line 177,in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
File "C:\Users\s1056280\Projects\dev\proj\app\views\queries.py",line 17,in load_projects
returnTable = ProjectsDataTable(request,Projects).output_result()
File "C:\Users\s1056280\Projects\dev\proj\app\util\table_queries.py",line 15,in __init__
self.run_query()
File "C:\Users\s1056280\Projects\dev\proj\app\util\table_queries.py",line 56,in run_query
self.cardinality_filtered = db.session.query(func.count(str(self.model_object.id))) \
File "C:\Users\s1056280\Projects\dev\proj\app\models\model.py",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',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]
模型类本身看起来像这样:
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),nullable=False)
date = Column(Integer,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 本身一起使用。它在我的 sqlite 数据库中存储为 CHAR(32)。
我已经尝试过不同的 uuid 模块以及自己编写的 - 但所有内容都有相同的 ValueError:格式错误的十六进制 UUID 字符串。
有人有想法吗?我会很感激,现在已经连续坐了两天
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。