Tra le altre cose nella mia vita, sto scrivendo una struttura in PHP per gestire una serie di problemi comuni a cui mi imbatto in ogni progetto che affronto. Il framework è attualmente molto incentrato sui dati, con il componente più grande (denominato Data) che fa parte ORM e parte DDD nel suo approccio.
L'ORM-ness di questo componente astrae pesantemente le query al punto che lo sviluppatore non ha bisogno di conoscere alcun SQL o nemmeno conoscere la terminologia SQL. Il motivo principale alla base di tutto ciò deriva dalla mia esperienza come DBA / BIDev, in cui mi sono lamentato di molte delle query costruite male dagli appassionati di SQL che facevano cose complicate piuttosto che l'approccio più semplice e diretto. Ad esempio, il codice seguente verrebbe r SELECT ... FOR UPDATE
dalla tabella user
dove username
è 'jennifer':
$userFilter = $userRepository->createBlank();
$userFilter->username()->identifyValue('jennifer');
$userFilter->lockForUpdate();
$user = $userRepository->retrieve($userFilter);
Metto alla prova il mio framework contro diverse applicazioni con cui sono coinvolto, il che significa che posso prendere in giro scenari di fuoco vero e proprio. Nei test recenti, mi sono imbattuto nel seguente errore:
SQLSTATE[0A000]: Feature not supported: 7 ERROR: FOR UPDATE is not allowed with window functions Failed query is: SELECT * FROM "myView" WHERE "ID"=:fi_ID__ix0 FOR UPDATE;
Si scopre che la vista myView
contiene una colonna generata da una funzione OLAP / finestra (cioè ROW_NUMBER() OVER(PARTITION BY...)
, il che significa che la vista non può essere selezionata per l'aggiornamento.L'errore è stato generato da PostgreSQL, è interamente legittimo, ed è naturalmente in risposta a questa operazione non valida.
Quello che mi chiedo è, quali sono i modi comuni / accettati che i framework gestiscono problemi di terze parti come questo? Pubblica il messaggio di errore letteralmente e lascia che lo sviluppatore lo calcoli o prova ad aggiungere valore al messaggio suggerendo problemi o vie di indagine comuni?