Dart: lavorare con un database MySQL

Di - 9 March 2013 - in
Post image for Dart: lavorare con un database MySQL

Nell’articolo di oggi ci occuperemo della libreria sqljocky, un connettore MySQL per Dart sviluppato da +James Ots. Sebbene sqljocky, chiamata così in onore del noto giocatore di freccette (darts in inglese) Jocky Wilson, non abbia ancora raggiunto la maturità necessaria per essere utilizzata in produzione, essa offre il necessario per effettuare semplici operazioni su un database MySQL: connettersi al database, eseguire una o più query simultaneamente e avviare una transaction, ovvero un’operazione che prepara una modifica al database da confermare in un secondo momento.

Per utilizzare sqljocky dobbiamo aggiungerla alle dipendenze del nostro progetto nel file pubspec.yaml:

dependencies:
    sqljocky: any

ed importarla:

import 'package:sqljocky/sqljocky.dart';

L’utilizzo di questa libreria è semplice: come si legge nel file README del progetto su GitHub, per avviare una connessione al database dobbiamo creare un’istanza di ConnectionPool e per eseguire una query dobbiamo invocare il metodo query():

ConnectionPool pool = new ConnectionPool(
    host: host,
    port: port,
    user: user,
    password: password,
    db: db,
    max: 5
  );

pool.query('select * from tabella').then((risultati) { . . . }

Per utilizzare i risultati della query:

for (row in result) {
    print('Name: ${row[0]}, email: ${row[1]}');
}

Preparare una query:

pool.prepare('insert into users (name, email, age) values (?, ?, ?)').then((query) {...});

Eseguire una query:

query.execute(['Bob', 'bob@bob.com', 25]).then((result) {...});

Avviare una transazione:

pool.startTransaction().then((trans) {
    trans.query('...').then((result) {
        trans.commit().then(() {...});
    });
});

Passiamo ad un esempio pratico, vediamo come sviluppare uno script che generi un report HTML di una tabella del database. Apriamo il Dart Editor, creiamo un nuovo progetto e aggiungiamo sqljocky: any alle dipendenze. Importiamo le librerie necessarie:

import 'dart:io';
import 'package:sqljocky/sqljocky.dart';

Prima di avviare la funzione main(), configuriamo i parametri per la connessione e inizializziamo le variabili che conterranno il codice HTML del risultato finale e il percorso del file generato dallo script:

String percorsoOutput = '/Users/me/Desktop/report.html';

String host = 'localhost';
int port = 8889;
String user = 'root';
String password = '12345';
String db = 'miodb';
String tabella = 'utenti';

String html_template;
String thead = "";
String tbody = "";

Vediamo ora la funzione main(): dovrà connettersi al database, eseguire una query e generare il codice HTML della tabella che conterrà i dati ottenuti:

void main() {

  ConnectionPool pool = new ConnectionPool(
      host: host,
      port: port,
      user: user,
      password: password,
      db: db,
      max: 5
      );

  pool.query('select * from $tabella').then((risultati) {

    thead=thead.concat("      <tr>\n");
    for(var campo in risultati.fields){
      thead=thead.concat('        <th scope="col">${campo.name.toUpperCase()}</th>\n');

    }
    thead=thead.concat("      </tr>");

    for (var riga in risultati) {
      tbody=tbody.concat("      <tr>\n");
      tbody = tbody.concat("        <td>${riga[0]}</td>\n");
      tbody = tbody.concat("        <td>${riga[1]}</td>\n");
      tbody = tbody.concat("        <td>${riga[2]}</td>\n");
      tbody=tbody.concat("      </tr>\n");
    }

    pool.close();
    generaHtml();
  });
}

Il metodo pool.query() restituisce un oggetto Future, di conseguenza le funzioni sui risultati devono essere contenute all’interno del metodo .then(), che viene eseguito quando la query è completa. L’oggetto risultati.fields è un oggetto di tipo List che contiene tutti i campi della tabella richiesta, mentre risultati contiene i valori della tabella.

Dopo aver preparato gli elementi HTML della tabella del nostro report, possiamo chiudere la connessione a MySQL — pool.close() — ed avviare la generazione del file.

La funzione generaHtml() definisce il template della pagina e genera il file:

generaHtml() {
  html_template="""
<!DOCTYPE html>
<html>
<style>
  table {
  width: 100%;
  padding:10px;
  }

  thead {
    background-color: rgba(0, 255, 0, 0.1);
  }

  tbody tr:nth-child(odd) {
    background-color: rgba(0, 200, 255, 0.1);
  }
</style>
<head>
  <title>Report $db.$tabella</title>
</head>
<body>
  <table>
    <thead>
$thead
    </thead>
<tbody>
$tbody
    </tbody>
  </table>
</body>
</html>
 """;

  File output = new File(percorsoOutput);
  output.writeAsStringSync(html_template);
}

Nello screenshot seguente vediamo il file HTML generato:

Screenshot

Il codice di questo script è disponibile sull’account di Engeene su GitHub.

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: