Come evitare codice non gestibile quando si utilizza SQL in un'impostazione MVC?

4

Voglio presentare un elenco di prodotti all'utente. Questo elenco è impaginato e può essere ordinato dall'utente per ID prodotto o nome prodotto in ordine crescente o decrescente.

Sto utilizzando un'impostazione MVC, in cui desidero interrogare il database nel modello.

Come scrivere funzioni che interrogano il database? Posso pensare a diverse opzioni che hanno tutti i loro svantaggi:

  1. Avere una funzione per ogni possibile combinazione di colonne di ordinamento e direzioni di ordinamento, ciascuna con una query diversa all'interno:

    func GetProductsOrderByIdAsc() []*Product { … }
    func GetProductsOrderByIdDesc() []*Product { … }
    func GetProductsOrderByNameAsc() []*Product { … }
    func GetProductsOrderByNameDesc() []*Product { … }
    

    Questo è ovviamente non gestibile in quanto porta a molte query SQL quasi identiche, dette anche "codice duplicato".

  2. Concatena le stringhe di SQL:

    func GetProducts(orderBy string, orderDirection string) []*Product {
        return db.query('
              SELECT id, name, description
                FROM products
            ORDER BY ' + orderBy + ' ' + orderDirection + '
        ')
    }
    

    Questo è inelegante, illeggibile e non gestibile in quanto diventa rapidamente un disastro-immaginare l'aggiunta di impaginazione e filtraggio. Il binding dei parametri non funzionerà qui poiché sono colonne e non valori.

  3. Ordina, filtra e impagina in Vai invece che in SQL. Ciò risolverebbe il problema della duplicazione del codice ma potrebbe essere un problema di prestazioni quando si registrano migliaia di record.

Qual è il solito concreto modo di risolvere questo problema? Idealmente non ci sarebbe nessun codice duplicato, nessuna brutta sintesi di query e nessuna inefficienza importante.

    
posta rightfold 18.12.2013 - 19:40
fonte

3 risposte

6

Non ho esperienza con Go, ma dal momento che il titolo della tua domanda non indica che è limitato a Go, risponderò in senso generale.

Il modo migliore per andare su SQL in MVC è utilizzare ORM per un modello. Alcune query potrebbero essere lente utilizzando ORM, nel qual caso potrebbero essere isolate in una funzione separata.

Se devi assolutamente scrivere la query tu stesso (mancanza di implementazione ORM disponibile, o query che richiedono un tweaking per le prestazioni, ecc.), preferirei avere modelli che prevedono parametri di sostituzione, simili al tuo # 2, ma che usano un motore di template solido esistente.

È importante notare che i parametri di query per SQL devono essere sempre sottoposti a escape per evitare l'iniezione SQL.

    
risposta data 18.12.2013 - 20:01
fonte
3

Prendo l'opzione # 2, quasi, sebbene il mio input non sia clausole SQL ma booleani e simili. La funzione quindi elabora in modo intelligente la query da quei parametri. Se non ti piace, fagli accettare un array contenente i valori per tutte le opzioni.

Non avere essere un disastro. Codice in modo corretto e robusto e apparirà / run bene.

    
risposta data 18.12.2013 - 19:50
fonte
0

Inserisci il tuo SQL nel DB ed esporli al modello come stored procedure - puoi farlo direttamente, oppure puoi avvolgerli in un livello di servizio più amichevole (es. usando un servizio web) che ti fornisce un'API come te Stai chiamando un'API web di terze parti. Ciò significa che devi pensare a quale tipo di dati API stai esponendo, piuttosto che avere tutto il DB disponibile, aiuta molto a mantenere il codice separato e gestibile. IT significa anche che hai molta più sicurezza se (o quando!) Qualcuno ha hackerato il tuo server web.

    
risposta data 18.12.2013 - 23:46
fonte

Leggi altre domande sui tag