Forum >> Programmazione Python >> Web e Reti >> File su cartella condivisa in rete

Pagina: 1

Vorrei creare un applicazione che archivi dei dati su un db sqlite3. Questa app dovrebbe girare su 3 o 4 pc (con windows) collegati in rete tra loro. Si tratta di una piccola rete aziendale.
Vorrei quindi far risiedere il file sqlite su una cartella condivisa e fare in modo di poterci accedere da tutti i pc.

Ho cercato in giro ma non ho capito come poter fare.

Ho iniziato da poco a studiare Python e volevo creare appunto questa piccola app.

In locale ho capito come realizzare il tutto, ma ciò che mi manca è come poter accedere al file db in rete.

Grazie a chi vorrà aiutarmi.
Non è una buona idea, in generale.




Situations Where A Client/Server RDBMS May Work Better

Client/Server Applications



If there are many client programs sending SQL to the same
database over a network, then use a client/server database
engine instead of SQLite. SQLite will work over a network filesystem,
but because of the latency associated with most network filesystems,
performance will not be great. Also, file locking logic is buggy in
many network filesystem implementations (on both Unix and Windows).
If file locking does not work correctly,
two or more clients might try to modify the
same part of the same database at the same time, resulting in
corruption. Because this problem results from bugs in
the underlying filesystem implementation, there is nothing SQLite
can do to prevent it.


A good rule of thumb is to avoid using SQLite
in situations where the same database will be accessed directly
(without an intervening application server) and simultaneously
from many computers over a network.




-- https://www.sqlite.org/whentouse.html


THE 🍺-WARE LICENSE (Revision ㊷):
<㎝🐌🐍.🇮🇹> wrote this post. As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you
think this stuff is worth it, you can buy me a 🍺 in return. -- ㎝
Si beh, non è una buona idea in generale, salvo il fatto che... funziona... :)




Premesso che in effetti NON è una buona idea, e cm ha ragione e dovresti essere consapevole dei problemi che possono venir fuori...
Premesso anche che la soluzione giusta sarebbe farsi assegnare dall'amministratore del sistema un accesso al DBMS, crearsi un proprio database e lavorare con quello...
E premesso soprattutto (tanto per parlar chiaro) che nove volte su dieci (ma se il tuo caso è diverso nessun problema... se...) se ti riduci a pensare a una soluzione "sqlite su share condivisa" è perché non hai le credenziali/autorizzazioni/requisiti/whatever per fare la cosa giusta, e quindi ti stai arrangiando così alla buona e in modo semiclandestino (la prossima domanda, in sette casi su dieci, è "come faccio a mettere una versione di pyton "portatile" dal momento che non ho le credenziali per installare python sulle macchine?", eccetera eccetera), e questo ti espone a una variegata serie di responsabilità/rischi futuri a cui non dovresti esporti...





Premesso tutto questo, sqlite (e quindi il driver "sqlite3" che trovi nella libreria standard di python) non ha nessun problema a collegarsi a un database "remoto", se ne conosci la URI e la macchina da cui lavori "vede" quella directory remota... banalmente ti colleghi al database proprio come faresti con un file locale...


A lato pratico, non dovresti avere problemi finché ti limiti a poche connessioni contemporaneamente, finché ci sono comunque più letture che scritture contemporanee... e certo, finché la qualità generale della connessione è sufficientemente stabile. Quello che devi capire è che, a differenza di un "vero" DBMS, con questo sistema in pratica sei in balia della robustezza delle primitive di accesso ai file del tuo sistema operativo... perché in pratica quello che stai facendo è appunto accesso a un file... e siccome dici "cartella" per dire "directory" (ehm), ne deduco che il tuo sistema operativo è windows... che non è proprio la pietra di paragone per robustezza delle primitive di accesso ai file... ma insomma, non fa neanche così schifo come una volta. Ora, sqlite fa del suo meglio per danzare in punta di piedi intorno alle primitive del sistema operativo... e "quasi" non ti rendi conto di quando due o tre client cercano di accedere contemporaneamente in scrittura allo stesso file...


Il peggio che può succedere è che una connessione si interrompa in modo anomalo (ai miei tempi si diceva: la donna delle pulizie che trancia il cavo di rete) nel mezzo di una transazione... Questo è praticamente impossibile con un DBMS, e francamente molto molto raro anche con sqlite... ovviamente se fai un minimo di attenzione a non lasciare una transazione aperta per più dello stretto necessario... ma questo va da sé... In ogni caso sqlite ha un sistema di journaling (in pratica crea un file temporaneo "journal" per conservare lo stato iniziale prima di avviare la transazione, e lo distrugge subito dopo), quindi se dopo un arresto anomalo ti ritrovi con un file "journal" ancora esistente vuol dire che hai una transazione fallita... ma anche in questo caso sqlite in genere si "riaggiusta" da solo... insomma, sono casi veramente rari... Devi esserne consapevole, certo... ma non sono cose che ti fanno perdere il sonno. Ovviamente devi avere una policy di backup molto accurata... un'altra cosa che con un DBMS ti risparmieresti...

Nessuna clandestinità... ho pieno accesso a tutti i pc come amministratore.
Non devo nemmeno chiedere come poter installare python su tali pc perché ho già provveduto a farlo per far girare altri programmini in python.

Uso comunque python sopratutto in accoppiata con il framework Django per altri motivi.




Ho fatto questa domanda semplicemente perché si tratta di un applicazione che dovrà fare accesso al database si e no 10 volte al giorno e i casi in cui l'accesso possa essere simultaneo sarebbero davvero rari.




Per quello che mi serve avrei potuto usare anche un semplice file per memorizzare i dati, ma avrei anche dovuto scrivere tutte le funzioni per le query.

Ecco perché opterei per sqlite.




Ciò che chiedo è: come devo dare l'indirizzo al file che risiede su una cartella condivisa?

Mettiamo che questa cartella sia su \\mario\cartellacondivisa...

Qual è il codice che devo scrivere?

Purtroppo ho cercato in giro ma forse anche a causa del mio scarso inglese non ho capito.




Grazie.
Che cosa è che non ti è chiaro nella documentazione, di preciso?

https://docs.python.org/3/library/sqlite3.html#sqlite3.connect



Non mi è chiaro come costruire il percorso...
Ammettiamo che il file del database sia su un pc che si chiama per esempio "mario" e nella cartella condivisa share/database...

Ho constatato che non va bene \\mario\share\database\file.db



visto che sei in windows, per usare la terminologia da utente medio windows... va bene qualsiasi "indirizzo" che, una volta copincollato nella "barra degli indirizzi" di una "finestra" aperta, su quella macchina, dando "invio" ti porta alla finestra voluta. Se windows su quella macchina vede quell'indirizzo, allora lo vede anche python/sqlite3. Quindi, se copincolli " \\mario\share\database\" nella barra degli indirizzi di una finestra aperta, dai invio, e vai a quella finestra, allora l'indirizzo è corretto. Senno, trova l'indirizzo giusto.
(parentesi... in genere su una lan aziendale le share remote sono comunque già mappate sulle varie macchine... dovresti trovarti un'indirizzo del tipo N:/bla/bla/bla... con una lettera convenientemente alta...)


Pagina: 1



Esegui il login per scrivere una risposta.