Escritura¶
Crear¶
usuario = dao.create(UsuarioCreate(nombre='Ana', email='ana@x.com')) # → UsuarioRead
n = dao.create_many([UsuarioCreate(...), UsuarioCreate(...)]) # → int
create devuelve la fila creada, ya con su clave primaria asignada.
Con relaciones anidadas¶
Los DTOs Create admiten el objeto relacionado, y tai-sql resuelve las claves foráneas:
public_sync_api.post.create(
PostCreate(
titulo='Hola',
contenido='...',
autor=UsuarioCreate(nombre='Ana', email='ana@x.com'),
)
)
Actualizar¶
# Por clave primaria
n = dao.update(id=1, updated_values=UsuarioUpdateValues(email='nueva@x.com')) # → int
# Masiva: filtros + valores
n = dao.update_many(UsuarioUpdate(
filter=UsuarioFilter(activo=False),
values=UsuarioUpdateValues(activo=True),
))
UsuarioUpdateValues solo lleva los campos que quieres escribir: lo que no declares no se toca.
update_many no ejecuta los triggers
Es una sentencia UPDATE ... WHERE que el motor resuelve de una vez, así que no hay filas
Python por las que pasar. Si la tabla tiene triggers y necesitas que se ejecuten, itera y
usa update().
Upsert¶
usuario = dao.upsert(
UsuarioCreate(nombre='Ana', email='ana@x.com'),
match_fields=['email'],
)
n = dao.upsert_many(registros, match_fields=['email'], batch_size=1000)
match_fields son las columnas con las que se decide si la fila ya existe. Por defecto, la
clave natural de la tabla; todas tienen que venir con valor en el DTO.
| Sin triggers | Con triggers | |
|---|---|---|
upsert |
SELECT + create() o update() |
igual, y los hooks se ejecutan |
upsert_many |
sentencia nativa del motor (INSERT ... ON CONFLICT, INSERT ... ON DUPLICATE KEY), por lotes |
separa altas y modificaciones, y delega en create_many() y update() |
Borrar¶
delete_many acepta los mismos filtros que find_many.
delete_many() sin filtros vacía la tabla
No hay una confirmación que te salve. Si el borrado es ancho, compruébalo primero con
count().
Auditoría¶
Si el schema declara operative_fields=True, todas las escrituras rellenan created_at,
updated_at, created_by y updated_by por su cuenta. El usuario sale del contexto:
Ver auditoría.
Triggers¶
Lo que declares como trigger se ejecuta dentro de estas operaciones, en la misma transacción, salvo en los caminos masivos que dice la tabla de arriba.