Generera UUID v4 i Python — uuid.uuid4()
Använd det kostnadsfria UUID v4 Generator direkt i webbläsaren — ingen installation krävs.
Prova UUID v4 Generator online →Varje gång jag behöver en kollisionssäker identifierare för en databasrad, API-spårning eller sessionstoken är svaret att generera UUID v4 i Python — en rad, inga beroenden: uuid.uuid4(). Pythons inbyggda uuid-modul använder os.urandom() för kryptografiskt säker slumpmässighet. För ett snabbt UUID utan att skriva kod fungerar UUID v4-generatorn online direkt. Den här guiden täcker UUID-objektets attribut, massgenerering, JSON-serialisering, databaslagring, validering, uuid-utils (~10× snabbare Rust-baserat drop-in-alternativ) och de fyra vanligaste misstagen — allt med Python 3.8+.
- →
uuid.uuid4()är inbyggt i Pythons stdlib —import uuidär allt du behöver, ingen pip-installation. - →Returvärdet är ett
uuid.UUID-objekt, inte en sträng — användstr(),.hexeller.bytesför att välja den representation som passar ditt lagringslager. - →UUID v4 använder 122 slumpmässiga bitar från
os.urandom()— kryptografiskt säker, ingen MAC-adress eller tidsstämpel exponeras. - →För tjänster med hög genomströmning är
pip install uuid-utilsett drop-in-alternativ som är ~10 gånger snabbare, drivet av Rust. - →Skicka aldrig
uuid.uuid4(utan parenteser) som ett standardargument direkt i en dataklass eller Pydantic-modell — det delar ett enda UUID för alla instanser.
Vad är UUID v4?
Ett UUID (Universally Unique Identifier) är en 128-bitars etikett formaterad som 32 hexadecimala siffror uppdelade i fem grupper med bindestreck: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Version 4 är den mest använda varianten: 122 av de 128 bitarna genereras slumpmässigt, och de återstående 6 bitarna kodar versionen (4) och varianten (RFC 4122). Det finns ingen tidsstämpel och ingen värdidentifierare — identifieraren är helt ogenomskinlig och integritetssäker. Sannolikheten att två oberoende genererade v4-UUIDs kolliderar är så liten att det för praktiska ändamål aldrig inträffar, även i distribuerade system som genererar miljontals ID:n per sekund.
event_id = "evt-" + str(random.randint(100000, 999999)) # fragile, not unique
event_id = str(uuid.uuid4()) # 3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e
uuid.uuid4() — Standardsättet att generera UUID v4 i Python
Modulen uuid är en del av Pythons standardbibliotek. Att anropa uuid.uuid4() returnerar ett uuid.UUID-objekt med en fullständig uppsättning attribut för olika representationer. Konvertering till en sträng med str() ger det kanoniska bindestrecksformat som API:er, databaser och HTTP-headers förväntar sig.
import uuid # Generera ett UUID v4 request_id = uuid.uuid4() print(request_id) # 3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e print(type(request_id)) # <class 'uuid.UUID'> print(request_id.version) # 4 # Konvertera till sträng för JSON / HTTP-headers print(str(request_id)) # "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e" print(request_id.hex) # "3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e" (inga bindestreck) print(request_id.bytes) # b';...' (16 råa bytes)
Ett vanligt verkligt mönster är att bifoga ett UUID till varje utgående API-begäran så att du kan korrelera loggar mellan tjänster. Här är en minimal requests-sessionswrapper som injicerar ett nytt UUID i varje anrop:
import uuid
import requests
def call_api(endpoint: str, payload: dict) -> dict:
trace_id = str(uuid.uuid4())
headers = {
"X-Request-ID": trace_id,
"Content-Type": "application/json",
}
response = requests.post(endpoint, json=payload, headers=headers, timeout=10)
response.raise_for_status()
return {"trace_id": trace_id, "data": response.json()}
# result["trace_id"] låter dig söka exakt begäran i alla tjänstloggar
result = call_api("https://api.example.com/v1/orders", {"product_id": "prod_7x2k", "qty": 3})
print(result["trace_id"]) # t.ex. "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e"När du genererar UUIDs i bulk — till exempel för att fylla en batch av databasrader i förväg — är ett list comprehension idiomatiskt och läsbart:
import uuid
# Förgenerera ID:n för 1000 telemetrihändelser
event_ids = [str(uuid.uuid4()) for _ in range(1000)]
print(f"Generated {len(event_ids)} unique IDs")
print(event_ids[0]) # t.ex. "a1c2e3f4-..."
print(event_ids[-1]) # olika värde varje gångBehöver du ett snabbt UUID utan att köra någon kod? Använd UUID v4-generatorn online för att kopiera ett nytt värde med ett klick, eller massgenera hundratals på en gång — användbart för att initiera testdatabaser eller fylla fixture-filer.
uuid.uuid4() anropar os.urandom(16) internt och sätter sedan bitarna 6–7 i byte 8 till 10 (variant) och bitarna 12–15 i byte 6 till 0100 (version 4). De återstående 122 bitarna är slumpmässiga. Det är därför du inte kan lita på versionen om du inte parsar med uuid.UUID().UUID-objektets attribut och representationer
Objektet uuid.UUID exponerar flera representationer av samma 128-bitarsvärde. Att välja rätt representation för ditt lagringslager förhindrar tyst datakorruption och slösade bytes.
import uuid
u = uuid.uuid4()
print(str(u)) # "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e" (36 tecken)
print(u.hex) # "3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e" (32 tecken, inga bindestreck)
print(u.bytes) # b';...' (16 bytes, big-endian)
print(u.bytes_le) # b'...' (16 bytes, little-endian)
print(u.int) # 78823... (128-bitars heltal)
print(u.version) # 4
print(u.variant) # 'specified in RFC 4122'
# Tur och retur: rekonstruera från sträng
reconstructed = uuid.UUID("3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e")
print(reconstructed == u) # True (om u var det värdet)För PostgreSQL med psycopg2 eller asyncpg skickar du UUID-objektet direkt — drivrutinen hanterar mappningen till den inbyggda uuid-kolumntypen. För SQLite använder du str(u) (TEXT) eller u.bytes (BLOB, 16 bytes jämfört med 36 för strängen). För lagringseffektivitet i stor skala är .bytes 55% mindre än den kanoniska strängen.
Validera och parsa UUID v4-strängar i Python
När ett UUID anländer från användarindata, en URL-sökvägsparameter eller ett externt API bör du validera det innan du använder det som en databasnyckel. Det idiomatiska tillvägagångssättet är att försöka konstruera med uuid.UUID() och fånga ValueError. Du kan också tvinga fram att det inkommande värdet specifikt är version 4 genom att kontrollera .version.
import uuid
def parse_uuid4(raw: str) -> uuid.UUID:
"""
Parsa och validera en UUID v4-sträng.
Kastar ValueError för ogiltigt format eller fel version.
"""
try:
u = uuid.UUID(raw)
except ValueError as exc:
raise ValueError(f"Invalid UUID format: {raw!r}") from exc
if u.version != 4:
raise ValueError(f"Expected UUID v4, got v{u.version}: {raw!r}")
return u
# Användning i en FastAPI / Flask-routehanterare
def get_order(order_id: str):
try:
uid = parse_uuid4(order_id)
except ValueError as exc:
return {"error": str(exc)}, 400
# säkert att använda uid i en DB-fråga nu
return {"order_id": str(uid), "status": "processing"}uuid.UUID() accepterar strängar med eller utan bindestreck, och accepterar även prefixet urn:uuid:. Därför parsar "3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e" (inga bindestreck) och "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e" båda till samma objekt.UUID v4 i JSON-nyttolaster och API-svar
JSON-standarden har ingen UUID-typ — ett UUID i JSON är alltid en sträng. Det innebär att du måste konvertera uuid.UUID-objektet till en sträng innan du skickar det till json.dumps(). Det renaste tillvägagångssättet är en anpassad JSONEncoder-underklass så att du aldrig behöver sprida str()-anrop genom hela kodbasen.
import json
import uuid
from datetime import datetime
class ApiEncoder(json.JSONEncoder):
"""Serialisera UUID- och datetime-objekt i JSON-svar."""
def default(self, obj):
if isinstance(obj, uuid.UUID):
return str(obj)
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
# Realistiskt API-svar med nästlade UUIDs
api_response = {
"request_id": uuid.uuid4(),
"created_at": datetime(2026, 3, 14, 9, 41, 0),
"order": {
"id": uuid.uuid4(),
"customer_id": uuid.uuid4(),
"items": [
{"product_id": uuid.uuid4(), "sku": "NVX-9000", "qty": 2},
],
},
}
print(json.dumps(api_response, indent=2, cls=ApiEncoder))
# {
# "request_id": "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e",
# "created_at": "2026-03-14T09:41:00",
# "order": {
# "id": "a1c2e3f4-...",
# ...
# }
# }För ett engångsserialiseringsanrop är default=-kroken enklare än att skapa en underklass:
import json, uuid
event_id = uuid.uuid4()
payload = {"event_id": event_id, "action": "checkout"}
# Skicka ett anropbart objekt; anropas bara för typer json inte kan hantera
json_str = json.dumps(payload, default=str)
print(json_str) # {"event_id": "3b1f8a9d-...", "action": "checkout"}När du tar emot ett svar från ett externt API bör du parsa UUID-strängarna tillbaka till objekt så att din kod får den fullständiga attributuppsättningen och typsäkerheten:
import json
import uuid
import requests
def fetch_shipment(shipment_id: str) -> dict:
"""Hämta en försändelse och returnera med typade UUID-fält."""
response = requests.get(
f"https://api.logistics.example.com/v2/shipments/{shipment_id}",
headers={"Accept": "application/json"},
timeout=10,
)
response.raise_for_status()
data = response.json()
# Parsa UUID-fälten tillbaka till uuid.UUID-objekt
try:
data["id"] = uuid.UUID(data["id"])
data["carrier_id"] = uuid.UUID(data["carrier_id"])
except (KeyError, ValueError) as exc:
raise RuntimeError(f"Malformed shipment response: {exc}") from exc
return dataFör att uppdatera UUID-fält i en JSON-fil på disk — till exempel rotera ett korrelations-ID i en konfigurations- eller seed-fil — läser du, muterar och skriver tillbaka atomärt:
import json, uuid
def rotate_correlation_id(path: str) -> str:
"""Ersätt eller lägg till 'correlation_id' i en JSON-fil. Returnerar det nya UUID:t."""
try:
with open(path) as f:
data = json.load(f)
except FileNotFoundError:
data = {}
except json.JSONDecodeError as exc:
raise ValueError(f"Invalid JSON in {path!r}: {exc}") from exc
new_id = str(uuid.uuid4())
data["correlation_id"] = new_id
with open(path, "w") as f:
json.dump(data, f, indent=2)
return new_idOm du inte vill köra ett skript varje gång du behöver inspektera ett UUID från ett API-svar klistrar du in det direkt i UUID Decoder — den visar version, variant och alla fält utan någon kod.
Generera UUID v4 från kommandoraden med Python
Pythons uuid-modul exponerar inte ett fristående CLI-underkommando som python -m json.tool, men en one-liner täcker samma användningsfall. Dessa är användbara i skalskript, CI-pipelines och när du behöver en tillfällig identifierare utan att öppna en REPL.
# Enstaka UUID v4 python3 -c "import uuid; print(uuid.uuid4())" # 3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e # Hex-format utan bindestreck — användbart för filnamn och miljövariabler python3 -c "import uuid; print(uuid.uuid4().hex)" # 3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e # Generera 5 UUIDs för ett batch-seed-skript python3 -c "import uuid; [print(uuid.uuid4()) for _ in range(5)]" # Använd i en skalvariabel DEPLOY_ID=$(python3 -c "import uuid; print(uuid.uuid4())") echo "Deploying with ID: $DEPLOY_ID"
uuidgen (ett C-verktyg) UUID v4-värden och är snabbare för rena skalskript. Använd Python-one-linern när du redan befinner dig i en Python-centrisk miljö och vill ha konsekvens med hur UUIDs genereras i din applikationskod.Högpresterande UUID v4 med uuid-utils
Standardbibliotekets uuid.uuid4() är tillräckligt snabb för de flesta applikationer — med några mikrosekunder per anrop hanterar den tusentals ID:n per sekund utan problem. Om du genererar UUIDs på den kritiska vägen för en tjänst med hög genomströmning (massinsättningar, händelsetelemetri i stor skala, eller begärans-ID-generering under hög last) är uuid-utils ett drop-in-alternativ drivet av Rust som benchmarkas till ungefär 10 gånger hastigheten av stdlib.
pip install uuid-utils
# uuid_utils är ett drop-in-alternativ för stdlib uuid-modulen import uuid_utils as uuid # Samma API som stdlib request_id = uuid.uuid4() print(request_id) # 3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e print(str(request_id)) # kanonisk sträng print(request_id.hex) # hex utan bindestreck print(request_id.version) # 4 # Stöder även v7 (tidssorterat, utmärkt för DB-primärnycklar) time_ordered_id = uuid.uuid7() print(time_ordered_id) # börjar med aktuellt tidsstämpelprefix
isinstance(u, uuid.UUID)-kontroller från standard- biblioteket använder du kompatibilitetsläget: import uuid_utils.compat as uuid. Kompatibilitetsläget är något långsammare än standardläget men fortfarande snabbare än stdlib.UUID v4 i dataklasser och Pydantic-modeller
Pythons dataklasser och Pydantic-modeller har båda inbyggt stöd för UUID-fält. Det viktigaste mönstret när du använder UUID som ett automatiskt genererat standardvärde är att skickafunktionsreferensen, inte ett anropsresultat — annars delar alla instanser samma UUID.
from dataclasses import dataclass, field
import uuid
@dataclass
class WorkerJob:
job_id: uuid.UUID = field(default_factory=uuid.uuid4)
worker_id: str = "worker-01"
payload: dict = field(default_factory=dict)
job1 = WorkerJob(payload={"task": "resize_image", "src": "uploads/img_4932.png"})
job2 = WorkerJob(payload={"task": "send_email", "to": "ops@example.com"})
print(job1.job_id) # unikt per instans
print(job2.job_id) # skiljer sig från job1.job_id
print(job1.job_id == job2.job_id) # Falsefrom pydantic import BaseModel, Field
import uuid
class OrderEvent(BaseModel):
event_id: uuid.UUID = Field(default_factory=uuid.uuid4)
order_id: uuid.UUID
status: str
amount_cents: int
event = OrderEvent(
order_id=uuid.UUID("a1c2e3f4-5b6d-4e7f-8c9d-0a1b2c3d4e5f"),
status="payment_confirmed",
amount_cents=4995,
)
print(event.model_dump_json(indent=2))
# {
# "event_id": "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e",
# "order_id": "a1c2e3f4-5b6d-4e7f-8c9d-0a1b2c3d4e5f",
# "status": "payment_confirmed",
# "amount_cents": 4995
# }
# Pydantic v2 serialiserar uuid.UUID som sträng automatisktVanliga misstag när du genererar UUID v4 i Python
Jag har sett alla fyra dessa mönster dyka upp i kodgranskningar och produktionsincidenter — de är lätta att missa eftersom de inte ger ett fel omedelbart.
Problem: Att skicka uuid.uuid4 (funktionsobjektet) som ett standardvärde i en dataklass eller modell utan att omsluta det i default_factory — Python utvärderar standardvärdet en gång vid klassdefinition, så alla instanser delar samma UUID.
Lösning: Använd default_factory=uuid.uuid4 i dataklasser eller Field(default_factory=uuid.uuid4) i Pydantic för att ett nytt UUID genereras per instans.
@dataclass
class Session:
# FEL: utvärderas en gång, alla instanser delar detta UUID
session_id: uuid.UUID = uuid.uuid4()@dataclass
class Session:
# RÄTT: factory anropas per instans
session_id: uuid.UUID = field(default_factory=uuid.uuid4)Problem: uuid.UUID-objekt är inte lika med vanliga strängar, så session_id == '3b1f8a9d-...' returnerar alltid False även när värdet matchar — detta bryter tysta sökningar.
Lösning: Jämför alltid UUID med UUID: omslut strängen med uuid.UUID() innan jämförelse, eller konvertera båda sidor till str().
# Returnerar False även när värdena matchar
if record["session_id"] == "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e":
revoke_session(record)target = uuid.UUID("3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e")
if record["session_id"] == target: # båda är uuid.UUID
revoke_session(record)
# Eller normalisera allt till strängar vid gränssnittet:
if str(record["session_id"]) == str(target):
revoke_session(record)Problem: uuid_obj.hex producerar en 32-teckens sträng utan bindestreck. Om nedströms kod förväntar sig det kanoniska 36-teckens bindestrecksformatet (vilket de flesta API:er och databaser gör) avvisar eller felparsas värdet i tysthet.
Lösning: Använd str(uuid_obj) för det kanoniska 36-teckensformatet om du inte har ett explicit krav på den kompakta hex-formen.
# Lagrar "3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e" — inga bindestreck
payload = {"correlation_id": request_id.hex}# Lagrar "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e" — standardformat
payload = {"correlation_id": str(request_id)}Problem: random.random() är inte kryptografiskt säker, och secrets.token_hex(16) producerar en 32-teckens hex-sträng som inte är ett giltigt UUID — nedströms validatorer som anropar uuid.UUID() på det kastar ValueError.
Lösning: Använd uuid.uuid4() när det mottagande systemet förväntar sig en UUID-formaterad identifierare. Använd secrets.token_hex() bara när du explicit behöver en slumpmässig token som inte är UUID-formad.
import random, secrets # Inte ett UUID — misslyckas med uuid.UUID()-validering request_id = secrets.token_hex(16) # "a1b2c3d4e5f6..." session_id = str(random.random()) # "0.8273..." — inte ens nära
import uuid request_id = str(uuid.uuid4()) # "3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e" # Giltigt UUID v4, kryptografiskt säkert
UUID-genereringsmetoder i Python — snabb jämförelse
Alla metoder nedan producerar 128-bitars identifierare men skiljer sig åt i entropikälla, integritetsegenskaper och huruvida de kräver en tredjepartsinstallation.
Använd uuid.uuid4() för allmänna unika identifierare i webbapplikationer, distribuerade system och databasprimärnycklar när sorterbarhet inte krävs. Använd uuid.uuid5() (eller v3) för deterministiska ID:n härledda från ett känt namnrymd och namn — till exempel för att generera ett stabilt ID för en kanonisk URL. Byt till uuid_utils.uuid7() när du behöver tidssorterade ID:n för databasindex (undviker siddelningar i B-trädindex vid höga infogningshastigheter). Använd uuid_utils.uuid4() när rågenereringsgenomströmning är flaskhalsen.
UUID v4 mot UUID v7 — vilket bör du använda?
Den vanligaste praktiska frågan är om man ska använda UUID v4 eller det nyare UUID v7 för databasprimärnycklar. Här är det korta svaret: använd UUID v4 som standard; byt till UUID v7 bara när indexfragmentering är ett uppmätt problem.
UUID v4-värden är helt slumpmässiga, vilket innebär att infogningar hamnar på slumpmässiga positioner i ett B-trädindex. Vid måttliga infogningshastigheter (hundratals till låga tusentals per sekund) är detta bra — indexet ryms i buffertpoolen och slumpmässiga skrivningar är billiga. Vid mycket höga infogningshastigheter orsakar slumpmässig placering frekventa siddelningar och cachemissar, vilket ökar skriv-amplifikationen och saktar ner frågor.
UUID v7 bäddar in en Unix-tidsstämpel med millisekundsprecision i de mest signifikanta bitarna, så rader som infogas nära varandra i tid hamnar också nära varandra i indexet. Detta ger B-trädindex (PostgreSQL, MySQL, SQLite) ett beteende som liknar ett auto-inkrement heltal: nya rader läggs alltid till i slutet av indexet och eliminerar siddelningar. Avvägningen är att UUID v7 kodar en tidsstämpel, vilket läcker skapelsetid — undvik det för användarsynliga ID:n där skapelsetiden är känslig.
I Python finns UUID v7 inte ännu i standardbiblioteket (från och med Python 3.12). Generera det med pip install uuid-utils och anropa uuid_utils.uuid7(). Det returnerar ett objekt med samma attributuppsättning som uuid.UUID, så migrering från v4 är en enradsändring i ID-fabriken.
För ett enkelklicksalternativ utan någon Python-konfiguration klistrar du in din UUID-sträng i UUID v4-generatorn och validatorn — den genererar, validerar och avkodar alla fält i webbläsaren.
Vanliga frågor
Hur genererar jag ett UUID v4 i Python?
Anropa uuid.uuid4() från Pythons inbyggda uuid-modul. Det returnerar ett UUID-objekt — konvertera till sträng med str() när du behöver en textrepresentation. Modulen ingår i standardbiblioteket så ingen pip-installation krävs.
import uuid session_id = uuid.uuid4() print(session_id) # t.ex. 3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e print(str(session_id)) # samma kanoniska sträng print(session_id.hex) # 3b1f8a9d2c4e4f6a8b0d5e7c9f1a3d2e (inga bindestreck)
Vad är skillnaden mellan uuid.uuid4() och str(uuid.uuid4())?
uuid.uuid4() returnerar ett UUID-objekt med attribut som .hex, .bytes, .int och .version. str(uuid.uuid4()) konverterar direkt objektet till en kanonisk 36-teckens sträng och kasserar objektet. Behåll objektet om du behöver flera representationer; konvertera till sträng vid gränssnittet där du skickar värdet till en JSON-nyttolast, databas eller HTTP-header.
import uuid u = uuid.uuid4() print(type(u)) # <class 'uuid.UUID'> print(u.version) # 4 print(u.hex) # 32-teckens hex, inga bindestreck print(u.bytes) # 16-byte binär print(str(u)) # kanonisk 36-teckens sträng med bindestreck
Är uuid.uuid4() kryptografiskt säker?
Ja. Pythons uuid.uuid4() använder os.urandom() internt, som läser från operativsystemets kryptografiskt säkra slumptalsgenerator (/dev/urandom på Linux/macOS, CryptGenRandom på Windows). De 122 slumpmässiga bitarna gör kollisionssannolikheten försumbar för alla realistiska arbetsbelastningar. Förväxla det inte med random.random(), som inte är kryptografiskt säker.
import uuid, os # uuid4 anropar os.urandom(16) internt raw = os.urandom(16) # uuid4 sätter versions- och variantbitar innan det returnerar u = uuid.UUID(bytes=raw, version=4) print(u) # giltigt v4 UUID från råa slumpmässiga bytes
Hur validerar jag att en sträng är ett giltigt UUID v4 i Python?
Parsa med uuid.UUID() och kontrollera attributet .version. Om strängen inte är ett giltigt UUID kastar uuid.UUID() ett ValueError — fånga det för att hantera ogiltig indata. Detta validerar också att formatet (bindestreck, längd) är korrekt.
import uuid
def is_valid_uuid4(value: str) -> bool:
try:
u = uuid.UUID(value)
return u.version == 4
except ValueError:
return False
print(is_valid_uuid4("3b1f8a9d-2c4e-4f6a-8b0d-5e7c9f1a3d2e")) # True
print(is_valid_uuid4("not-a-uuid")) # False
print(is_valid_uuid4("3b1f8a9d-2c4e-1f6a-8b0d-5e7c9f1a3d2e")) # False (v1, inte v4)Hur lagrar jag UUIDs i en PostgreSQL- eller SQLite-databas från Python?
Med PostgreSQL (via psycopg2 eller asyncpg) skickar du UUID-objektet direkt — drivrutinen anpassar det till den inbyggda UUID-typen. Med SQLite, som saknar inbyggd UUID-typ, lagrar du som TEXT med str(uuid_obj) eller som BLOB med uuid_obj.bytes. SQLAlchemy har en UUID-kolumntyp som hanterar detta automatiskt för olika dialekter.
import uuid
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE events (id TEXT PRIMARY KEY, name TEXT)")
event_id = uuid.uuid4()
conn.execute("INSERT INTO events VALUES (?, ?)", (str(event_id), "user_signup"))
conn.commit()
row = conn.execute("SELECT * FROM events").fetchone()
# Rekonstruera UUID-objekt från lagrad sträng
retrieved_id = uuid.UUID(row[0])
print(retrieved_id.version) # 4Kan jag generera flera UUIDs på en gång i Python?
Ja — använd ett list comprehension eller en generator. Varje anrop till uuid.uuid4() är oberoende och garanterat att producera ett distinkt värde. För massiv generering där genomströmning spelar roll är uuid-utils (Rust-baserat) ungefär 10 gånger snabbare än standardbiblioteket.
import uuid
# Generera 5 unika spårnings-ID:n för en batchbegäran
trace_ids = [str(uuid.uuid4()) for _ in range(5)]
for tid in trace_ids:
print(tid)
# Varje rad är ett distinkt UUID v4Relaterade verktyg
- →UUID v4 Generator — Generera UUID v4-värden direkt i webbläsaren — ingen Python-miljö krävs. Kopiera ett enskilt värde eller massgenerera hundratals på en gång.
- →UUID v7 Generator — Generera tidssorterade UUID v7-värden — sorterbara efter skapelsetid, idealiska för databasprimärnycklar där indexfragmentering är ett problem.
- →UUID Decoder — Inspektera vilket UUID som helst — version, variant, tidsstämpel (v1/v7) och nodfält — utan att skriva en parser från grunden.
- →JWT Decoder — Avkoda och inspektera JWT-tokens, som ofta bär UUID-subject-anspråk (sub) eller jti-identifierare tillsammans med sessions-UUIDs.
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.