Da Access a MySQL
Come effettuare la migrazione dei dati da un file MS Access a un DB MySQL
Dal sito HTML.it Da Access a MySQL
La crescita di internet mette continuamente a dura prova numerosi soggetti del web, dagli utenti agli hoster, dagli sviluppatori ai programmatori. Sempre più frequentemente accade dunque che siti, inizialmente nati appoggiandosi ad un database Access, si trovino a dover valutare il passaggio verso database più performanti. Sebbene l’accoppiata ASP + SQL Server garantisca servizi e prestazioni eccezionali, allo stesso tempo il costo e la complessità di quest’ultimo non sempre incoraggiano i programmatori alla migrazione. Negli ultimi anni si sta diffondendo velocemente anche nel mondo ASP un database molto potente e soprattutto gratuito: MySQL. Questo prodotto, inizialmente nato come accoppiata vincente con Php, sta riscuotendo molto successo anche con linguaggi Microsoft Oriented grazie alle continue modifiche e migliorie apportate dal team di sviluppo. Tuttavia, essendo due tecnologie di produzioni differenti, non sempre il passaggio da Access a MySQL in ambiente ASP è così in dolore, soprattutto se si è fatto largo uso della sintassi proprietaria che Microsoft ha promosso nel tempo per facilitare l’interazione tra i suoi prodotti. Questo piccolo inconveniente non deve però spaventarci e soprattutto non deve rappresentare un motivo per non valutare di sfruttare le potenzialità offerte da MySQL. Questo articolo si propone per venire incontro a quanti desiderano stimare le differenze per una eventuale migrazione e si compone in due parti. Nella prima verranno affrontati i concetti strutturali, teorici e gestionali che differenziano i due database. Nella seconda verranno invece riportate le principali differenze legate alla scrittura del codice per una migrazione quanto più possibile indolore. Perché MySQL? Le motivazioni sono numerosissime ed assumono maggiore importanza quanto maggiore è il grado di conoscenza del mondo della programmazione di chi affronterà la valutazione. Eccone alcune: - È gratuito. Sebbene Access sia ormai sufficientemente diffuso da essere presente quasi su ogni computer fa parte della suite Office e per tanto non è scaricabile gratuitamente ma è necessario acquistare una licenza. - È Open Source. È possibile agire direttamente se lo si desidera sul codice sorgente. - È nato per il web. Access è nato come desktop database, ovvero un database studiato per strutturare applicazioni legate all’uso su computer e non orientate alla rete. Questo punto è quindi forse il più fondamentale. MySQL integra il supporto a numerosissime funzioni in più rispetto ad Access, tra cui ad esempio l’accesso remoto e migliore bilanciamento delle elaborazioni. - È più leggero. Lo abbiamo detto prima: Access è nato sul desktop. Proprio per questo si porta dietro, come una lumaca, il suo prezioso guscio, rappresentato dall’intera consolle grafica che contraddistingue il programma. Se da una parte questa interfaccia facilita la gestione, dall’altra inevitabilmente ha un costo, non tanto in termini monetari quanto sicuramente in termini di risorse e soprattutto peso finale del database. Potremmo continuare quasi all’infinito. Potremmo segnalare che MySQL non ha le stesse limitazioni sulle connessioni contemporanee che gravano su Access, potremmo sottolineare come sia facile ed agevole creare nuovi database su un server MySQL rispetto ad un file Access, ma non basterebbero numerosi articoli. Assumendo che le motivazioni precedenti siano sufficienti per farvi almeno valutare l’idea di proseguire l’argomento MySQL, affrontiamo allora le principali caratteristiche strutturali. Risorse utili Di seguito è riportato un elenco delle principali risorse che in seguito verranno menzionate o utilizzate per la gestione e l’interazione con MySQL. MySQL: il database di riferimento per l’articolo. È possibile scaricarlo gratuitamente da qui Connector/ODBC: i driver di connessione al database. È possibile scaricarli gratuitamente da qui PhpMyAdmin: un potente programma sviluppato in php per la gestione via browser del database. È possibile scaricarlo gratuitamente da qui MySQL-Front: un utile programma per gestire tramite interfaccia visuale un database MySQL. L’ultima versione rilasciata gratuitamente è la 2. 5, in alternativa è possibile acquistare la nuova release dal sito ufficiale Principali differenze Le differenze tra MySQL ed Access, come prima anticipato, sono estremamente numerose, tuttavia la più evidente è quella legata all’interfaccia del programma. Access è nato per un uso desktop e fornisce quindi un ambiente visuale semplice e maneggevole per gestire comodamente query, tabelle e relazioni. La prima cosa che noteremo, o meglio, che non noteremo in seguito al primo avvio di MySQL è proprio questa struttura. MySQL è infatti un database nato per ambienti web e come tale focalizza le sue potenzialità sull’efficienza tralasciando l’aspetto visivo. Cosa significa questo? Semplice, MySQL è un database che va gestito tramite codice. In linea generale è possibile affermare che non esiste un "file del database". Non perdiamo quindi tempo a cercare un file che assomigli al noto .mdb poiché non lo troveremo. MySQL è a tutti gli effetti un server in grado di gestire più di un database. Come per un normale server, anche per connetterci a MySQL avremo quindi bisogno di un indirizzo (in genere un IP) e di un opportuno account fornito dall’amministratore, in genere corredato da password. Con questi dati potremo accedere ai nostri database memorizzati, via codice o mediante strumenti di gestione. Vedremo più avanti, nella seconda parte, come specificare questi dati nella stringa di connessione ASP facendo uso dei driver opportuni. Ricapitolando abbiamo detto che MySQL è una struttura in grado di ospitare più database, accessibile mediante un account ma allora… come amministrarlo senza interfaccia grafica? La risposta è proprio quella che non vorreste sentire: via codice. Via comandi SQL è infatti possibile gestire nella quasi totalità la struttura creando nuovi database, tabelle, query, modificando record ed informazioni. Certamente questa soluzione, sebbene estremamente potente, è assai improponibile per gli utenti che non hanno una approfondita conoscenza del linguaggio SQL; non solo, potrebbe anche richiedere maggiore tempo rispetto ad una interazione con una struttura visuale. Fortunatamente esistono in rete numerosi strumenti di gestione per MySQL che permettono di svolgere praticamente quasi ogni operazione di amministrazione. PhpMyAdmin Figura 1. Screenshot di PhpMyAdmin PhpMyAdmin è uno dei più diffusi pannelli di gestione via browser per MySQL. È scritto interamente in php, è scaricabile gratuitamente e consente l’accesso a più livelli al database server. Permette di creare, modificare e rimuovere agevolmente interi database, tabelle, record e dati. Consente inoltre di esportare ed importare rapidamente strutture e dati. MySQL Front Figura 2. Screenshot di MySQL Front Al contrario di PhpMyAdmin che consiste in una interfaccia via browser, MySQL Front è invece a tutti gli effetti un programma. Anche questo strumento permette di connettersi a database in locale o remoto e di amministrarli mediante l’uso di icone e comandi decisamente più intuitivi. In più mediante questo software è possibile, in ogni momento, leggere la sintassi SQL per il comando eseguito (non dimentichiamoci che MySQL è gestibile solo via codice) per poterlo memorizzare per scopi futuri. L'uso di questi programmi agevola notevolmente la gestione dei nostri database MySQL e ci permette di lavorare in un ambiente più familiare rispetto ad Access. Esportazione, importazione e gestione della struttura Una delle domande più frequenti, a questo punto, è come è possibile allora salvare il contenuto di un database MySQL, come è possibile creare un database da una struttura data o ancora come importare delle informazioni da un vecchio database. La risposta è sempre una: SQL. Non essendoci un file da maneggiare fisicamente, l’esportazione o l’importazione di un database avviene mediante pura sintassi SQL. Esportare un database significa quindi salvare in un file di testo un elenco di comandi che siano in grado, una volta eseguiti in fase di importazione, di ricreare la struttura delle tabelle e reinserire i dati contenuti. In poche parole un elenco di query CREATE TABLE (creazione di tabelle) e di INSERT di record. Ecco un esempio di uno spezzone di una esportazione di un database MySQL. - - Struttura della tabella `tblst_counter` - CREATE TABLE `tblst_counter`( `Counters_ID` int(10) unsigned NOT NULL auto_increment, `Anno` int(10) unsigned NOT NULL default ‘0’, `Hits` int(10) unsigned NOT NULL default ‘0’, `Visits` int(10) unsigned NOT NULL default ‘0’, PRIMARY KEY (`Counters_ID`) ) TYPE=MyISAM AUTO_INCREMENT=2 ; - - Dump dei dati per la tabella `tblst_counter` - INSERT INTO `tblst_counter` VALUES (1, 2005, 30581, 6089); È possibile notare nella prima parte la sintassi di creazione della tabella e nella seconda parte l’inserimento di un record all’interno. Prima che qualcuno decida di chiudere qui questo articolo e abbandonare l’idea di migrare a MySQL dalla disperazione, è bene segnalare che gli stessi tool prima citati sono in grado di esportare ed importare il contenuto dei database rendendo, anche in questo caso, il tutto molto più semplice. L’estensione adottata per questi file è generalmente . sql anche se si tratta di una pura convenzione. In alcuni casi si potrebbe quindi sentire dire i file. sql sono database MySQL. Questo in realtà non è del tutto corretto, o meglio, per dirla in termini matematici l’equazione .sql : MySQL = .mdb : Access non è vera. I file prima menzionati contengono un elenco di query e comandi e possono essere ricondotti ad un database MySQL, ma non rappresentano fisicamente il database stesso. A primo avviso questa "nuova ottica" meno grafica del solito potrebbe sembrare decisamente poco amichevole ma non lasciamoci influenzare dalle apparenze. Sarà sufficiente qualche giorno per abituarsi dopo di che tutto ci sembrerà assolutamente normale. Non solo, saremo in gradi di apprezzare come proprio la mancanza di questo pesante fardello grafico permetta alle strutture di MySQL di essere assai più leggere e meno ingombranti delle stesse realizzate in Access. In alcuni casi la differenza potrebbe anche sorprenderci e offrirci un risparmio di diversi Mb (anche decine) che, soprattutto su un sito in hosting, possono fare la differenza. Finora abbiamo visto, in linea generale, cosa è necessario per procedere con la migrazione del nostro sito da Access a MySQL. Entriamo ora nel dettaglio delle modifiche principali al codice richieste dal nuovo database. Prima di cominciare è necessaria una premessa. Al momento in cui si scrive la release ufficiale è la 4.1.11 mentre è già possibile scaricare la beta della 5.0.4. Dal rilascio della serie 4.x il team di sviluppo di MySQL ha introdotto importanti novità per estendere la compatibilità ed il supporto ad ADO per l’interazione con la tecnologia ASP. Questo significa ad esempio che è ora possibile utilizzare anche con MySQL alcune sintassi prima possibili solo su Access e SQLServer, tipo l’uso del metodo .AddNew. Sebbene alcune istruzioni siano quindi contemplate al momento, è bene conoscerne le alternative per evitare di incappare in problemi nel loro utilizzo su versioni precedenti. Stringa di connessione La parte fondamentale è, neanche a dirlo, la stringa di connessione al database. Mentre in Access era disponibile un driver proprietario (.mdb) oppure il più performante OLEDB, per MySQL dobbiamo utilizzare il driver ODBC che è possibile scaricare direttamente dal sito del database. Al momento la versione disponibile è la Connector/ODBC 3.51. Una volta installati driver sarà sufficiente utilizzare la seguente stringa di connessione: stringaConnessione = "driver=Mysql ODBC 3.51 Driver;server=mysqlserver; uid=mysqluser; pwd=mysqlpassword; database=mysqldatabase" dove mysqlserver: indirizzo del server. Può essere un indirizzo IP o un nome di rete mysqluser: utente abilitato alla connessione. mysqlpassword: password associata all’utente. mysqldatabase: nome del database a cui connettersi. Ciascun server mysql può infatti contenere più di un database. Vediamo un esempio specifico dove per semplicità useremo delle costanti per salvare le informazioni di connessione ed aiutare a comprendere la differenza tra le parti fisse della stringa di connessione e quelle da adattare. Access Const ACCESS_DATABASE = "nomedatabase.mdb" 'nome del database strConn = “Provider=Microsoft.Jet.OLEDB.4.0; Data Source=” & Server.MapPath(ACCESS_DATABASE) MySQL Const MYSQL_SERVER = “localhost” ‘ indirizzo del server Const MYSQL_USER = “nomeutente” ‘ utente Const MYSQL_PASSWORD = “lamiapassword” ‘ password Const MYSQL_DATABASE = “nomedatabase” ‘ nome del database strConn "driver=Mysql ODBC 3.51 Driver;server=" & MYSQL_SERVER & ";uid=" & MYSQL_USER & ";pwd=" & MYSQL_PASSWORD & "; database=" & MYSQL_DATABASE & "" In entrambi i casi la connessione verrà poi aperta come di consueto con Set nomeConnessione = Server.CreateObject(“ADODB.Connection”) nomeConnessione.Open strConn Gestione dei record La situazione più problematica legata al passaggio a MySQL partendo da una struttura Access è forse quella legata alla gestione dei record e recordset, soprattutto se si ha fatto largo uso dei metodi che ADO mette a disposizione per ASP. Come anticipato in precedenza, dalla versione 4 MySQL ha esteso il supporto a questi metodi, tuttavia è bene abituarsi a fare uso della sintassi SQL standard, per due buone ragioni: - È uno standard - Risulta decisamente più performante Vediamo allora cosa cambia nello specifico. Inserimento di record Se passiamo a MySQL dovremo fare a meno del metodo .AddNew() sostituendo quest’ultimo con il più performante comando SQL INSERT. Vediamo un esempio direttamente su una semplice query per l’inserimento di tre campi, uno testuale, uno interno ed uno data. Access strSQL = “SELECT Campo_ID FROM nometabella” nomeRecordset.Open strSQL, nomeConnessione, 3, 3 ‘ Inserisci un nuovo record nomeRecordset.AddNew ‘ Inserisci i campi nomeRecordset.Fields(“Campo_testo”) = strVariabile nomeRecordset.Fields(“Campo_intero”) = intVariabile nomeRecordset.Fields(“Campo_data”) = dtmVariabile ‘ Aggiorna il comando nomeRecordset.Update nomeRecordset.Close Il codice sopra mostra un semplice inserimento. Si crea una query SELECT, la si esegue, si istruisce l’inserimento di un nuovo record con .AddNew e poi si inseriscono i campi eseguendo l’aggiornamento a fine istruzione con .Update. MySQL strSQL = “INSERT INTO nometabella (Campo_testo, Campo_intero, Campo_data) ” &_ “VALUES (‘” & strVariabile & “‘, ” & intVariabile & “, ‘” & dtmVariabile & “‘) ” ' Esegui la query nomeConnessione.Execute(strSQL) Notare come la sintassi SQL preveda l’uso di ‘ (apici singoli) come delimitatori di campi testo e data mentre non sono previsti delimitatori per i campi numerici. Si raccomanda particolare attenzione a filtrare le variabili per evitare spiacevoli inconvenienti da tentativi di SQL Injection. Aggiornamento di record Situazione analoga è quella della query di aggiornamento. Anche in questo caso non è possibile usare .Update a favore della gestione delle query in puro SQL con la sintassi UPDATE. Access strSQL = “SELECT Campo_ID FROM nometabella” nomeRecordset.Open strSQL, nomeConnessione, 3, 3 ' Inserisci i campi nomeRecordset.Fields(“Campo_testo”) = strVariabile nomeRecordset.Fields(“Campo_intero”) = intVariabile nomeRecordset.Fields(“Campo_data”) = dtmVariabile ' Aggiorna il comando nomeRecordset.Update nomeRecordset.Close MySQL strSQL = “UPDATE nometabella SET ” &_ “Campo_testo = ‘” & strVariabile & “‘, ” &_ “Campo_intero = ” & intVariabile & “, ” &_ “Campo_data = ‘” & dtmVariabile & “‘ ” ‘ Esegui la query nomeConnessione.Execute(strSQL) Anche in questo caso valgono tutti gli accorgimenti prima accennati riguardo i diversi tipi di dati. Eliminazione di record Anche l’eliminazione prevede l’adozione della sintassi DELETE al posto del metodo .Delete(). Access strSQL = “SELECT Campo_ID FROM nometabella WHERE condizione” nomeRecordset.Open strSQL, nomeConnessione, 3, 3 ‘ Rimuovi record nomeRecordset.Delete nomeRecordset.Close MySQL strSQL = “DELETE FROM nometabella WHERE condizione” ‘ Esegui la query nomeConnessione.Execute(strSQL) In particolare per il caso della rimozione di record il costrutto ADO risulta assai obsoleto e difficilmente si incontreranno esempi che ne fanno uso. Conteggio dei record Mentre con Access è possibile utilizzare la proprietà .RecordCount del recordset per il conteggio dei record restituiti dalla query, questo non è pienamente supportato da MySQL per il quale sarà necessario usare una query apposita con la sintassi SELECT COUNT. Access strSQL = “SELECT Campo_ID FROM nometabella WHERE condizione” nomeRecordset.Open strSQL, nomeConnessione, 3, 3 totale = nomeRecordset.RecordCount nomeRecordset.Close MySQL strSQL = “SELECT COUNT(Campo_ID) FROM nometabella WHERE condizione” nomeRecordset.Open strSQL, nomeConnessione, 3, 3 totale = nomeRecordset(0) nomeRecordset.Close Gestione delle date Passando a MySQL è necessario modificare alcune delle query che coinvolgono delle date. In particolare, è necessario verificare la sintassi SQL delle query ed il formato delle date in input. Sintassi per le query Mentre in Access è necessario delimitare nelle query SQL il valore di un campo data con l’uso di #, MySQL accetta invece il delimitatore ‘ (singolo apice). Ecco un esempio pratico su una query di inserimento ed una di aggiornamento. Ricordarsi che le stesse modifiche sono da applicare anche alle query di SELECT e DELETE. Access ' Esempio con variabile e costante strSQL = “INSERT INTO nometabella (campotesto1, campotesto2, campodata) " &_ "VALUES ('"' & vartesto & "', 'altrotesto', #" & vardata & "#) " ' Esempio con variabile strSQL = “UPDATE nometabella SET campodata = #" & vardata & "# " ' Esempio con costante strSQL = "UPDATE nometabella SET campodata = #2005-02-05# " MySQL ' Esempio con variabile e costante strSQL = "INSERT INTO nometabella (campotesto1, campotesto2, campodata) " &_ “VALUES '" & vartesto & "', 'altrotesto', '" & vardata & "') " ' Esempio con variabile strSQL = "UPDATE nometabella SET campodata = '" & vardata & "' " ' Esempio con costante strSQL = "UPDATE nometabella SET campodata = '2005-02-05' " L’esecuzione della query richiederà come di consueto il comando nomeConnessione.Execute(strSQL) Il formato data Access è in grado, almeno teoricamente, di gestire correttamente almeno 3 formati di data: lo standard yyyy/mm/dd, l’inglese mm/dd/yyyy e l’italiano dd/mm/yyyy. Di fatto, l’ultimo formato, viene gestito correttamente solo fino a quando il valore del mese e della data non risultano una combinazione tale da poter essere considerati nel valore inglese e quindi scambiati con conseguenti problemi gestionale. Per quanto riguarda MySQL la soluzione è tanto più drastica quanto efficiente. L’unico formato supportato è infatti quello ISO, ovvero la struttura yyyy/mm/dd dove lo 7 può essere tranquillamente (e comunemente) rimpiazzato con un -. A questo è poi possibile accodare l’ora nel formato consueto hh:mm:ss per un risultato finale del tipo yyyy-mm-dd hh:mm:ss Per poter gestire correttamente la migrazione al nuovo database è quindi necessario rivedere tutti gli inserimenti di date e prevedere una funzione che automaticamente splitti la data e la ricomponga come necessario. Ciò è facilmente ottenibile semplicemente usando le funzioni Year(), Month() e Day() messe a disposizione da vbscript oppure la più generica DatePart(). Non solo. Siccome Access è in grado di gestire correttamente anche questo formato, peraltro standard anche per SQL Server sarebbe opportuno abituarsi già dal principio all’uso di questa struttura per non trovarsi poi ad un certo punto a dover sconvolgere numerose istruzioni per un cambio database. Vediamo un semplice esempio legato ad un aggiornamento di un record. Access strSQL = "UPDATE nometabella SET campodata = #09/24/2005# " MySQL strSQL = "UPDATE nometabella SET campodata = '2005-09-24' " L’esecuzione della query richiederà come di consueto il comando nomeConnessione.Execute(strSQL) Paginazione Alcuni cambiamenti riguardano anche la paginazione dei record. MySQL non accetta infatti la sintassi SELECT TOP N usata con Access per selezionare i primi N record della query. Questo non significa che non sia possibile usare questa logica, semplicemente che è necessario procedere diversamente. Per MySQL è a disposizione il termine LIMIT che deve però essere posto come ultima istruzione della query. Access strSQL ="SELECT TOP 5 * FROM nometabella " MySQL strSQL = "SELECT * FROM nometabella LIMIT 5 " Infine, sempre per quanto riguarda la paginazione, fino a versioni precedenti alla 4 non erano supportate le istruzioni tipiche per questo scopo come ad esempio .PageSize e .AbsolutePage. Al posto MySQL è possibile gestire il numero di record e la loro posizione sempre facendo uso alla clausula LIMIT, dove il primo valore numerico corrisponde al numero del record di partenza mentre il secondo, dopo la virgola, il numero del record finale. strSQL = “SELECT * FROM nometabella LIMIT 5, 40 " La query sopra produrrà come risultato tutti i record a partire dal numero 5 a 40. Arrivati alla fine di questo articolo dovremmo conoscere un numero sufficiente di informazioni per valutare come procedere correttamente ad uno spostamento del sito da Access a MySQL. Si raccomanda di fare largo uso della documentazione ufficiale di MySQL e del sito di supporto che offrono numerose informazioni, codici e suggerimenti utili: qui |
---|