Ir al contenido

UUID, Email & DateTime

PyGo proporciona tipos escalares validados integrados para casos de uso comunes:

  • UUID: Identificador Único Universal (v4 por defecto)
  • Email: Dirección de correo electrónico conforme a RFC 5322
  • DateTime: Fecha y hora ISO 8601 con conciencia de zona horaria
  • URL: URL validada
  • Phone: Número de teléfono validado
  • Decimal: Tipo decimal para cálculos precisos

Todos los tipos escalares se validan en tiempo de compilación y generan código Go y Python idiomático.

model User:
id: UUID # UUID v4 auto-generado
name: String

Go:

type User struct {
ID string `json:"id"`
Name string `json:"name"`
}

Python:

import uuid
class User(BaseModel):
id: uuid.UUID
name: str
CREATE TABLE user (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL
);
model Contact:
email: Email
name: String

Los correos se validan en tiempo de compilación:

# Válido
contact = Contact(email="user@example.com", name="Alice")
# Inválido — error de compilación
# contact = Contact(email="not-an-email", name="Bob")

Formato: local-part@dominio (conforme a RFC 5322)

Go:

type Contact struct {
Email string `json:"email"`
Name string `json:"name"`
}

Python:

class Contact(BaseModel):
email: str # validado al asignar
name: str
model Event:
title: String
started_at: DateTime
ended_at: DateTime?
model Article:
title: String
created: DateTime = now() # Establecido al crear
updated: DateTime? # Optional, actualizado manualmente

Todos los campos DateTime almacenan fechas con zona horaria en UTC por defecto:

event = Event(
title="Launch",
started_at="2024-01-15T09:00:00+05:00" # Con zona horaria
)
# Almacenado internamente como UTC
# event.started_at → 2024-01-15 04:00:00 UTC

Go:

import "time"
type Event struct {
Title string
StartedAt time.Time
EndedAt *time.Time
}

Python:

from datetime import datetime
class Event(BaseModel):
title: str
started_at: datetime
ended_at: Optional[datetime] = None
CREATE TABLE event (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
started_at TIMESTAMP WITH TIME ZONE,
ended_at TIMESTAMP WITH TIME ZONE
);
model Website:
url: URL
name: String

URL validada (ej. https://example.com/path).

model Contact:
phone: Phone
name: String

Número de teléfono validado (ej. +1-555-123-4567).

model Product:
name: String
price: Decimal

Tipo decimal para cálculos financieros precisos.

Go:

type Product struct {
Name string
Price string // Decimal almacenado como string para precisión
}

Python:

from decimal import Decimal
class Product(BaseModel):
name: str
price: Decimal
model Profile:
user_id: UUID
secondary_email: Email? = None
last_login: DateTime? = None
model Group:
name: String
member_ids: Array[UUID]
Tipo Tipo Python Tipo Go Tipo DB
UUID uuid.UUID string UUID
Email str (validado) string TEXT
DateTime datetime time.Time TIMESTAMP
URL str string TEXT
Phone str string TEXT
Decimal Decimal string TEXT
  • Siempre usa UUID como claves primarias — nunca enteros autoincrementales
  • Valida correos en el nivel del modelo, no en la capa del controlador
  • Almacena todas las fechas en UTC — convierte a hora local solo para mostrar
  • Usa Decimal para valores monetarios o numéricos precisos
  • Usa Email? para campos de correo opcionales