Saltar a contenido

Escritura

dao = public_sync_api.usuario

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

n = dao.delete(id=1)            # → int
n = dao.delete_many(activo=False)

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:

from database.public import set_username
set_username('ana')

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.

Todo en una transacción

with sync_session_manager.get_session() as session:
    usuario = dao.create(UsuarioCreate(nombre='Ana'), session=session)
    public_sync_api.post.create(
        PostCreate(titulo='Primero', contenido='...', autor_id=usuario.id),
        session=session,
    )

Ver sesiones y transacciones.