微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flask-SQLAlchemy-SQLite:无法处理 GUID 对象服务器端 - ValueError:格式错误的十六进制 UUID 字符串

如何解决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 举报,一经查实,本站将立刻删除。