FastAPI-格式错误的十六进制UUID字符串 [英] FastAPI - badly formed hexadecimal UUID string
本文介绍了FastAPI-格式错误的十六进制UUID字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用FastAPI&;SQLModel将数据插入到SQLite数据库中(我正在张贴一些字段,然后SQLModel添加UUID和DATETIME字段并插入到数据库中)。
将数据发布到FastAPI时,偶尔会收到ValueError:
ValueError: badly formed hexadecimal UUID string
我认为我发送的数据没有问题,因为我没有发送id字段,所以可能我错误地配置了我的SQLModel?
型号:
# -*- coding: utf-8 -*-
import uuid
from typing import Optional
from datetime import datetime, date
from pydantic import UUID4, HttpUrl
from sqlmodel import Field, SQLModel
class EventBase(SQLModel):
title: str
text: str
date: date
URL: HttpUrl
category: Optional[str] = Field(default=None)
class Event(EventBase, table=True):
id: UUID4 = Field(default_factory=uuid.uuid4, primary_key=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
编辑:已决定尝试approach将UUID4替换为uuid.UUID,但效果不佳:
Uvicorn调试:
INFO: 127.0.0.1:53312 - "POST /speeches/ HTTP/1.1" 500 Internal Server Error
ERROR: Exception in ASGI application
Traceback (most recent call last):
File "c:githubspeeches-apienvlibsite-packagesuvicornprotocolshttph11_impl.py", line 373, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "c:githubspeeches-apienvlibsite-packagesuvicornmiddlewareproxy_headers.py", line 75, in __call__
return await self.app(scope, receive, send)
File "c:githubspeeches-apienvlibsite-packagesuvicornmiddlewaredebug.py", line 96, in __call__
raise exc from None
File "c:githubspeeches-apienvlibsite-packagesuvicornmiddlewaredebug.py", line 93, in __call__
await self.app(scope, receive, inner_send)
File "c:githubspeeches-apienvlibsite-packagesfastapiapplications.py", line 208, in __call__
await super().__call__(scope, receive, send)
File "c:githubspeeches-apienvlibsite-packagesstarletteapplications.py", line 112, in __call__
await self.middleware_stack(scope, receive, send)
File "c:githubspeeches-apienvlibsite-packagesstarlettemiddlewareerrors.py", line 181, in __call__
raise exc
File "c:githubspeeches-apienvlibsite-packagesstarlettemiddlewareerrors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "c:githubspeeches-apienvlibsite-packagesstarletteexceptions.py", line 82, in __call__
raise exc
File "c:githubspeeches-apienvlibsite-packagesstarletteexceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "c:githubspeeches-apienvlibsite-packagesstarlette
outing.py", line 656, in __call__
await route.handle(scope, receive, send)
File "c:githubspeeches-apienvlibsite-packagesstarlette
outing.py", line 259, in handle
await self.app(scope, receive, send)
File "c:githubspeeches-apienvlibsite-packagesstarlette
outing.py", line 61, in app
response = await func(request)
File "c:githubspeeches-apienvlibsite-packagesfastapi
outing.py", line 226, in app
raw_response = await run_endpoint_function(
File "c:githubspeeches-apienvlibsite-packagesfastapi
outing.py", line 161, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "c:githubspeeches-apienvlibsite-packagesstarletteconcurrency.py", line 39, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "c:githubspeeches-apienvlibsite-packagesanyio o_thread.py", line 28, in run_sync
return await get_asynclib().run_sync_in_worker_thread(func, *args, cancellable=cancellable,
File "c:githubspeeches-apienvlibsite-packagesanyio\_backends\_asyncio.py", line 818, in run_sync_in_worker_thread
return await future
File "c:githubspeeches-apienvlibsite-packagesanyio\_backends\_asyncio.py", line 754, in run
result = context.run(func, *args)
File ".appmain.py", line 29, in create_events
session.refresh(event)
File "c:githubspeeches-apienvlibsite-packagessqlalchemyormsession.py", line 2315, in refresh
loading.load_on_ident(
File "c:githubspeeches-apienvlibsite-packagessqlalchemyormloading.py", line 407, in load_on_ident
return load_on_pk_identity(
File "c:githubspeeches-apienvlibsite-packagessqlalchemyormloading.py", line 541, in load_on_pk_identity
return result.one()
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 1407, in one
return self._only_one_row(
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 558, in _only_one_row
row = onerow(hard_close=True)
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 1271, in _fetchone_impl
return self._real_result._fetchone_impl(hard_close=hard_close)
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 1674, in _fetchone_impl
row = next(self.iterator, _NO_ROW)
File "c:githubspeeches-apienvlibsite-packagessqlalchemyormloading.py", line 147, in chunks
fetch = cursor._raw_all_rows()
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 392, in _raw_all_rows
return [make_row(row) for row in rows]
File "c:githubspeeches-apienvlibsite-packagessqlalchemyengine
esult.py", line 392, in <listcomp>
return [make_row(row) for row in rows]
File "c:githubspeeches-apienvlibsite-packagessqlalchemysql ype_api.py", line 1537, in process
return process_value(value, dialect)
File "c:githubspeeches-apienvlibsite-packagessqlmodelsqlsqltypes.py", line 59, in process_result_value
value = uuid.UUID(value)
File "C:UsersuserAppDataLocalProgramsPythonPython38libuuid.py", line 169, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
推荐答案
我了解到在issue:数据验证‘中描述了该问题,除非uuid.uuid4默认工厂创建了一个以零开头的十六进制字符串的uuid。’
建议的(临时)解决方案由chrisWhite 199在评论中发布below:
根据我的案例进行调整:
def new_uuid() -> uuid.UUID:
# Note: Work around UUIDs with leading zeros: https://github.com/tiangolo/sqlmodel/issues/25
# by making sure uuid str does not start with a leading 0
val = uuid.uuid4()
while val.hex[0] == '0':
val = uuid.uuid4()
return val
class Event(EventBase, table=True):
id: UUID4 = Field(default_factory=new_uuid, primary_key=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
这篇关于FastAPI-格式错误的十六进制UUID字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文