Dovremmo avere un SQL indipendente dal database come linguaggio di query in Django?

5

Nota:

  • So che abbiamo già Django ORM che mantiene le cose indipendenti dal database e converte in query SQL specifiche del database.
  • Una volta che le cose iniziano a complicarsi, è preferibile scrivere raw SQL query per una migliore efficienza.
  • Quando scrivi raw sql query il tuo codice viene intrappolato con il database che stai utilizzando.
  • Capisco anche che è importante utilizzare tutta la potenza del tuo database che non può essere raggiunto solo con django orm .

La mia domanda:

  • Fino a quando non utilizzo una funzione specifica del database, perché dovremmo essere intrappolati con il database.
  • Ad esempio:

We have a query with multiple joins and we decided to write a raw sql query. Now, that makes my website postgres specific. Even when I have not used any postgres specific feature.

Credo che ci dovrebbe essere un po 'di fake sql linguaggio che può tradurre in qualsiasi query sql di un database. Anche l'ORM di Django può essere costruito su di esso. Quindi, se esci da ORM ma non da database specifico, puoi comunque rimanere indipendente dal database.

Ho chiesto la stessa domanda a Jacob Kaplan Moss (Di persona):

  • Mi ha consigliato di stare con il database che mi piace e sopportare tutto il suo potere, al quale sono d'accordo. Ma il mio punto non era che dovremmo essere database independent .
  • Il punto è che dovremmo essere indipendenti dal database fino a quando non utilizzeremo una funzione specifica del database.

Spiega, perché dovrebbe esserci un layer fake sql sul sql attuale?

================================

Aggiornamento:

================================

Il mio suggerimento:

Risolvi l'indipendenza del database su un livello fake sql e quindi crea ORM su quel falso sql. Quindi, se devo scrivere una query sql, userò fake sql che funzionerebbe su tutti i database e ancora su SQL raw. In questo modo, rimarrò indipendente dal database a meno che non utilizzi una funzione molto specifica per il mio database.

Pertanto, una query come select * from table limit 10; funzionerà sia su postgres sia su 'MS-SQL Server'.

È ragionevole?

Nota:

  • Non sto parlando di ANSI SQL , sto suggerendo un fake sql per far funzionare tutti i database con 1 sql standard. [Che potrebbe non coprire le funzionalità specifiche di db]
posta Yugal Jindle 22.10.2012 - 07:30
fonte

3 risposte

6

Penso che tu stia cercando lo standard ANSI SQL .

Questo standard è implementato nella maggior parte degli RDBMS per la maggior parte.

Tuttavia, ogni RDBMS ha deciso di fare qualcosa a modo suo. (Semplicemente perché lo standard non aveva la funzione o un altro motivo. LIMIT ha un equivalente da SQL: 2008 solo per esempio.)

Elencare queste differenze dallo standard SQL richiederebbe un'intera pagina web per farlo. Oh aspetta, è stato fatto !

Quindi per rispondere a te, proprio per questo motivo, non puoi essere indipendente da RDBMS senza perdere prestazioni (cioè costruendo un livello). Le differenze nelle implementazioni standard SQL sono ciò che ha spinto le persone a creare ORM.

    
risposta data 22.10.2012 - 10:34
fonte
3

Il principio YAGNI è importante in questo caso.

Al momento di decidere sull'argomento, dovresti considerare i vantaggi e gli svantaggi dell'essere legati a un database specifico.

Non è che ci siano migliaia di database diversi là fuori. Per i database relazionali, le scelte popolari sono Postgres e Mysql. E le loro differenze e caratteristiche distinte sono ben note, quindi è facile confrontarle in anticipo per il problema che stai per risolvere.

Se hai il controllo dell'ambiente di produzione, studia le differenze tra loro e scegline uno.

Se non sei nel controllo dell'ambiente di produzione, ad esempio se distribuirai il software agli utenti finali e li installerai sulle loro piattaforme, dovresti mirare all'indipendenza del database.

A meno che tu non abbia davvero una ragione convincente per essere indipendente dal database, sarà una seccatura e ti morderai a lungo termine se miri a farlo. Il consiglio generale per questo tipo di situazioni è non fare le cose solo per il gusto di farlo.

    
risposta data 22.10.2012 - 11:39
fonte
-2

Le API del database Python usano una convenzione comune, che è praticamente la stessa su diversi database (ma non proprio!). Puoi leggere la documentazione di MySQLdb qui.

C'è anche un'interfaccia più ricca di funzionalità per mysql, chiamata oursql. Ha una vera parametrizzazione (non solo un'interpolazione di stringa glorificata), cursori sul lato server, streaming di dati e così via.

    
risposta data 22.10.2012 - 09:18
fonte

Leggi altre domande sui tag