我怎樣才能生成一個適用于SQLite的UUIDField呢?
我想在我的測驗中使用SQLite而不是Postgres,這樣它們就會運行得更快。
# settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql"。
# ...。
}
}
# 測驗使用sqlite而不是postgres。
import sys
if (
"test" in sys.argv or "test_coverage"in sys.argv
): # Covers regular testing and django-coverage.
DATABASES["default"]["ENGINE"] = "django.db.backends.sqlite3"
然而,我似乎無法創建一個符合Django的UIDField的SQLite的UUID:
一個用于存盤通用唯一識別符號的欄位。使用了Python的UUID類。當在PostgreSQL上使用時,它存盤在uuid資料型別中,否則存盤在char(32)中。
即使uuid的值是32個字符,下面的方法也不奏效:
class Item(models.Model)。
uuid = models.UIDField()
.
uuid = str(uuid.uuid4()) 。 replace("-"/span>, ""/span>)
Item.objects.create(uuid=uid)
我得到這個錯誤。django.db.utils.InterfaceError。錯誤系結引數4 - 可能是不支持的型別。
編輯:
這里是完整的錯誤:
----------------------------------------------------------------------
回溯(最近一次呼叫)。
檔案 "/usr/local/lib/python3.9/site-packages/django/db/backends/utils. py", line 84, in _execute
return self.cursor.execute(sql, params)
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/backends/sqlite3/base. py", line 423, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.InterfaceError。Error 系結parameter 4 - probably unsupported type.
上述例外的直接原因是以下例外的。
回溯(最近一次呼叫)。
檔案 "/app/library/tests/tests_views_auth. py", line 423, in test_post_list_items_works
c1 = Chapter.objects.create(title="B1C1", body="B1C1", parent=b1)
檔案 "/24reads/library/models.py", 行 117, 在 創建
return super().create(**kwargs)
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/models/manager。 py", line 85, in manager_method
return getattr(self.get_queryset(), name) (*args, **kwargs)
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/models/query. py", line 453, in create
obj.save(force_insert=True, using=self.db)
檔案 "/usr/local/lib/python3.9/Site-packages/django_lifecycle/mixins。 py", line 134, in save
save(*args, **kwargs)
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/models. py", line 1091, in save
self.insert_at(
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/models. py", line 771, in insert_at
self._tree_manager.insert_node(
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/managers. py", line 42, in wrapped
return getattr(self._base_manager, method.__name__)(*args, **kwargs)
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/managers. py", line 43, in wrapped
return method(self, *args, **kwargs)
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/managers。 py", line 537, in insert_node
self._create_space(2, space_target, tree_id)
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/managers。 py", line 816, in _create_space
self._manage_space(size, target, tree_id)
檔案 "/usr/local/lib/python3.9/Site-packages/mptt/managers. py", line 1052, in _manage_space
cursor.execute(
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/backends/utils. py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
檔案 "/usr/local/lib/python3.9/Site-packages/jango/db/backends/utils. py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
檔案 "/usr/local/lib/python3.9/Site-packages/jango/db/backends/utils. py", line 84, in _execute
return self.cursor.execute(sql, params)
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/utils. py", line 90, in __exit__
抬高dj_exc_value.with_traceback(traceback) from exc_value
檔案 "/usr/local/lib/python3.9/Site-packages/jango/db/backends/utils. py", line 84, in _execute
return self.cursor.execute(sql, params)
檔案 "/usr/local/lib/python3.9/Site-packages/django/db/backends/sqlite3/base. py", line 423, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.InterfaceError。Error系結parameter 4 - probably unsupported type.
----------------------------------------------------------------------
我的特定用例看到我覆寫了基本的MPTTMel和TreeManager,以使用UUID而不是連續的整數,以避免并發問題,如這里所概述的。https://github.com/django-mptt/django-mptt/issues/555#issuecomment-331315715
class AsyncSafeTreeManager(TreeManager):
def _get_next_tree_id(self)。
if (
"test" in sys.argv or "test_coverage"in sys.argv
): # Covers regular testing and django-coverage
return uuid.uuid4()
return generate_ulid_as_uuid()
class AsyncSafeMPTTModel(MPTTModel)。
objects = AsyncSafeTreeManager()
tree_id = models.UUIDField()
class Meta:
abstract = True。
當我使用PostGRE時,這個方法可以正常作業,但在SQLite中卻不能作業。
uj5u.com熱心網友回復:
無論底層型別是什么,Django都會將UUID轉換為正確的格式,并將其插入資料庫中。對于SQLite來說,這意味著UUIDField將把它轉換為一個字串。
因此,你可以通過以下方式創建一個專案:
import uuid
Item.objects.create(
uuid=uuid.uuid4()
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323524.html
標籤:
上一篇:帖子中使用的標簽被用戶評論的次數
下一篇:跨越多值化的關系
