PDA

View Full Version : [Django] Dubbi su l'utilizzo multidatabase


Herod2k
03-12-2010, 08:51
Ciao ragazzi,

sto valutando l'ipotesi di utilizzare django per un progetto abbastanza grande che devo sviluppare, per ora mi sono letto parecchia documentazione e mi sembra un ottimo framework, peró ho solo un dubbio, e vorrei togliermelo prima di mettermi seriamente a progettare/programmare il sito.

La piattaforma che devo sviluppare è multidominio e si adatta in base al dominio di accesso, e ogni dominio ha i suoi dati.

Pensavo di fare cosi: fare un database, dove mettere i domini in una tabella, nella stessa tabella mettere user, password, host e tipo di database, del relativo database del sito, quindi fare una prima query per vedere quale base di dati deve utilizzare la piattaforma e poi.. connettermi al database "effettivo"

Quindi ricapitolando.
L'utente mette l'indirizzo nel browser, l'utente viene reindirizzato sulla nostra piattaforma, da li come è entrato il sistema vede da che dominio proviene, fa una query al db ed estrae i dati di connessione per il database effettivo, si connette e disegna il sito con i dati del dominio selezionato.

Django puó farlo?
Il dubbio mi è venuto perchè il settings.py mi sembra abbastanza "statico" non vorrei sbattermi per una cosa che o non si puó fare o che mi ci vuole un'enormitá di codice per farla, non vorrei che l'ORM si rifiutasse di collaborare :D con tutti sti cambi di connessione.

Grazie

H2K

cdere
03-12-2010, 23:23
ho utilizzato django per un progettino personale, è davvero un ottimo framework.
Ma pensando al tuo quesito non saprei proprio dirti sinceramente, intanto mi iscrivo, se non viene in tuo aiuto qualcuno di più ferrato di me faccio qualche prova io e ti so dire..

Herod2k
05-12-2010, 20:11
grazie mille, nel frattempo anche io cerco una soluzione.

cdere
09-12-2010, 15:04
http://www.google.it/search?q=django+multi+database&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:it:official&client=firefox-a è il primo risultato

:rolleyes:

Herod2k
13-12-2010, 12:52
http://www.google.it/search?q=django+multi+database&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:it:official&client=firefox-a è il primo risultato

:rolleyes:

vero, avevo dimenticato di dire che avevo letto giá la documentazione del sito ufficiale, il problema è che la documentazione spiega come creare un multidatabase con i parametri preimpostati nel settings.py peró non spiega come farlo con dei parametri dinamici provenienti da db (sempre si puó fare).

Diciamo che avró N clienti, e ogni cliente avrá il suo database, non li voglio unire per questioni di quantitá di dati e di privacy... metti caso che scrivo una query sbagliata non voglio che un utente possa accedere ai dati di altre persone per sbaglio o per altri motivi.
Ogni cliente avrá quindi il suo DB, tutti i db avranno la stessa struttura.

In pratica devo riuscire a cambiare la connessione una volta che il cliente fa il login e reindirizzarla al database del cliente specifico, ovviamente in maniera totalmente trasparente.

H2K

cdere
13-12-2010, 18:43
ah bhè, così direi che la storia è ben diversa.
Secondo me, se hai queste esigenze così specifiche ti conviene prendere in considerazione un framework più flessibile da questo punto di vista

Herod2k
14-12-2010, 15:53
Ce l'ho fatta! :D

Scrivo come, magari puó tornare comodo a qualcuno.

Ho impostato nel settings.py due database (per ora ho fatto le prove sono sqlite3 peró non vedo perchè non dovrebbe funzionare anche con gli altri tipi di db)
ho creato 2 models.py con le strutture del db in 2 applicazioni differenti.
1. Databaseclienti (db di default)
2. DBClientSingolo

ho seguito la guida ufficiale sul multidb in Django e ho creato un DBRouter (la guida è abbastanza criptica in questo senso, ho dovuto faticare un po')

ho generato entrambi i db con syncdb e ho riempito il primo con alcuni clienti e con le indicazioni sul db di ogni cliente.
Il secondo l'ho lasciato vuoto, ho clonato il secondo db in piu copie e l'ho riempito con i dati del cliente specifico.

Nel settings.py quindi come ho giá detto inzialmente chiamo 2 db il primo è pieno di dati e l'altro è un db vuoto, al login faccio la query (con l'ORM di Django) e mi vado a prendere i dati del db specifico del client, con i dati caricati sovrascrivo i dati del secondo db

from django.conf import settings
settings.DATABASES['DBClientSingolo']['NAME']=dati.database.name

e inizio a fare le query al DB effettivo del cliente e Django risponde perfettamente.
query che si scrive specificando il db in questo modo:
Anagrafe.objects.using('DBClientSingolo').all()

Nel codice soprariportato cambio solo il name del db perchè è sqlite3 nel caso fosse un'altro tipo di database si dovrebbero cambiare tutti i dati di connessione.

Non so se è il metodo piu pulito per fare quello di cui ho bisogno peró è l'unico che ho trovato fin'ora, vi tengo aggiornati nel caso di sviluppi.

Grazie per l'aiuto

H2K

cdere
14-12-2010, 16:02
ottimo lavoro! E grazie per la condivisione :D

Johnn
16-12-2010, 22:29
Penso si possa approcciare al problema anche in modo differente, cioè utilizzando i permessi a livello esculsivamente del db: ogni utente può fare query solo dove ha i permessi. Potrebbe essere comodo a tal proposito creare uno schema all'interno di uno stesso db per ciascun utente. So che si può fare con Posgresql. Che db usi?

Django, o chi per esso, non si dovrebbe più preoccupare della questione.

Herod2k
17-12-2010, 08:44
Penso si possa approcciare al problema anche in modo differente, cioè utilizzando i permessi a livello esculsivamente del db: ogni utente può fare query solo dove ha i permessi. Potrebbe essere comodo a tal proposito creare uno schema all'interno di uno stesso db per ciascun utente. So che si può fare con Posgresql. Che db usi?

Django, o chi per esso, non si dovrebbe più preoccupare della questione.
la tua idea mi pare ottima dovrei studiarmela meglio, ora in sviluppo sto usando sqlite3 che comodo, specialmente perchè lo posso mettere in un repository svn, dopo in produzione useró un db piu potente sicuramente, peró ancora non ho scelto pensavo mysql, pero anche postgree non lo scarterei.