[PHP/SQL] Generare grafici a partire dallo schema SQL di un database
Può esser sicuramente interessante avere una visualizzazione grafica di uno schema SQL, in grado di evidenziare i legami fra le varie tabelle a colpo d'occhio. Infatti non sempre creiamo noi delle basi di dati e alle volte abbiamo a disposizione solo un dump del database.
Fonte immagine: A Ovest di Paperino
Ho visto che MySQL Workbench è in grado di importare uno script SQL e di generare il grafico che evidenzia le tabelle e i legami fra di esse.
In aggiunta ho trovato uno script PHP, Visualize, il quale facendo uso di Graphviz, può generare grafici in formato PNG degli script SQL rappresentanti lo schema di un database.
Sul sito è possibile scaricare uno screencast che mostra tale script in funzione, per comodità ho eseguito l'upload di tale filmato su Youtube e ve lo mostro di seguito (quanto l'autore scrive nella shell è maggiormente visibile nel filmato originale).
08:13 | Categorie: MySQL, PHP, SQL | 0 Comments
[SQL]La query del giorno
Si vuole produrre una query che dia come risultato dei record i cui campi della tabella sono:
- anno di riferimento per le spese;
- Totale vendite per quell'anno;
- Totale fatturato lordo;
- Totale fatturato ivato.
Però volevo che facesse tutto MySQL di modo da semplificare al massimo la gestione del risultato con PHP. Quindi ecco la query finale:
select count(*) as totFatture,
@totLordo := (select truncate(sum(fatturatoLordo),2) from table
where [conditions...]
and data between UNIX_TIMESTAMP('2007/01/01') and
unix_timestamp('2007/12/31')) as totLordo,
@totIva := @totLordo + (select truncate(sum(fatturatoIvato),2) as totIva from
table where [conditions...]
and data between UNIX_TIMESTAMP('2007/01/01')
and unix_timestamp('2007/12/31')) as totIva,
@first := 2007 as anno
from table where [conditions...] and data
between UNIX_TIMESTAMP('2007/01/01') and unix_timestamp('2007/12/31')
group by anno
UNION
select count(*) as totFatture,
@totLordo := (select truncate(sum(fatturatoLordo),2) from table
where [conditions...] between
UNIX_TIMESTAMP('2008/01/01') and unix_timestamp('2008/12/31'))
as totLordo,
@totIva := @totLordo + (select truncate(sum(fatturatoIvato),2) from fatture
where [conditions...] and data
between UNIX_TIMESTAMP('2008/01/01') and
unix_timestamp('2008/12/31')) as totIva,
@second := 2008 as anno
from tablewhere [conditions...] and data between
UNIX_TIMESTAMP('2008/01/01') and unix_timestamp('2008/12/31')
group by anno
00:07 | Categorie: MySQL, SQL | 0 Comments
[SQL] MySQL tips
Connessione e dumping
- cambiare la password di un utente:
update user set password=PASSWORD("pippo") where user="root";
flush privileges; - esportare solo le istruzioni DDL dal database:
mysqldump db_name --no-data > script_file.sql
Aggiungere--databasesse si vuole creare anche
il database al pari di altri oggetti. - avviare MySQL senza far scattare i beep per gli errori:
mysql -uroot --no-beep -p
Query
- Selezionare l'ultimo elemento della tabella:
select field1,field2, ...
from table [where=...]
order by field1 DESC limit 1;
-- oppure...
select field from table
where id=last_insert_id(); -- dove id è di tipo auto_increment
Date ed orari
- Selezionare l'ora corrente:
select now(); -- 2008-05-26 12:46:08
-- oppure...
select current_timestamp; - Selezionare solo la data corrente senza l'ora:
select CAST(now() as date); -- 2008-05-26
-- oppure...
select current_date; - Selezionare solo l'ora corrente senza la data:
select CAST(now() as time); -- 12:47:34
-- oppure...
select current_time; - Selezionare lo unix timestamp a partire da una data:
select unix_timestamp('2007/03/26 16:21:56')
-- è uguale a mktime(16,21,56,3,26,2007,-1) in PHP
23:10 | Categorie: MySQL, SQL | 2 Comments
Win-get: uso e creazione di un repository
Introduzione
Win-get è un packet manager a linea di comando per windows che sfrutta le funzionalità di wget,un porting per Windows del programma omonimo per Linux.
Presenta una lista di programmi via Web (quelli accessibili anche dall'applicazione) e se ci si registra si ha il vantaggio di poter cliccare su dei "+" a fianco dei nomi dell'applicazione e associare l'applicazione stessa al nostro account. In questa maniera sfrutando l'opzione "restore" di win-get,è possibile installare tutti i programmi associati al nostro profilo (specificando le credenziali di autenticazione o nel file di configurazione o come opzioni da linea di comando).
Esiste anche un ' estensione per Firefox (non ancora provata quindi non vi so dire nulla in termini di utilità e compatibilità tra le varie versioni) che permette di segnalare un'applicazione. Fate attenzione che il server non è configurato per le estensioni firefox quindi vi verrà chiesto di scaricarla. Dovrete poi installare tale estensione con "Apri con" e scegliendo Firefox o da linea di comando "firefox estensione.xpi".
Trovate un'altra recensione di questo software su newstechnology.
Funzionamento tecnico
Questo è un pogetto open source,quindi sono disponibili i sorgenti per poterci creare il nostro repository, ma NON l'interfaccia amministrativa e "perlustrativa" del sito ufficiale (in attesa di chiarimenti).
Win-get farà delle query come questa ad uno script PHP (notate i parametri inviati via GET) e si otterrà un file XML descrittivo che verrà poi gestito da Win-get e presentato nel prompt dei comandi.
Come illustra questa query e quella nella foto,sembra che questo progetto sia un repository di collegamenti alle applicazioni da scaricare e che sul server Sourceforge non abbiano messo alcun software (molto probabilmente perchè non si può nemmeno fare). Quindi se guadate al file XML ritornato dalla precedente query,l'indirizzo del file zip verrà dato in pasto a wget presumo.
Creazione di un proprio repository
Ho intenzione di creare un repository su Aruba sfruttando i files forniti,ma permettendo anche di scaricare direttamente dal server Aruba i software,dal momento che godo di spazio illimitato :-D (ma non banda illimitata presumo!). Chi è su Aruba sa che si hanno a disposizione solitamente 5 database predefiniti per un hosting da 30 sacchi l'anno (mi pare,a me hanno regalato il sottodominio quindi non ricordo :-D). Quindi l'istruzione CREATE DATABASE `w154283_winget` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; non sarà possibile. Possiamo:
- rinominare uno dei database predefiniti,azione possibile dal pannello di controllo selezionado "Operazioni";
- semplicemente modificare USE w154283_winget; con il nome del nostro database e cancellare o commentare la creazione del database.
Prendiamo quindi il dump del database e imbocchiamolo a PHPMyAdmin presente su Aruba. Il database è composto da 5 tabelle:
- applications: contiene i dati generali di un'applicazione e il link dove risiede;
- dependencies: le dipendenze per una determinata applicazione;
- errors: gli errori in riferimento alle applicazioni;
- mirrors: eventuali mirrors per una certa applicazione;
- requests: identica ad applications,mi è ancora sconosciuto il significato della sua ridondante esistenza;
Fatto questo basta caricare i file winget.php e db.php sul proprio server. L'indirizzo del proprio repository sarà quello rappresentato dalla locazione del file winget.php.
A questo punto manca tutta l'interfaccia amministrativa che il sito ufficiale presenta. Ho chiesto a Ryan se è possibile avere tali files,dal momento che su CVS di sourceforge presenta solo i 3 files menzionati.
Nel caso non fosse possibile ne costruirò una mia non appena avrò tempo :)
16:32 | Categorie: MySQL, PHP, programmazione, software, SQL, Windows | 0 Comments
Creare una funzione plpgsql che prelevi i dati di una select attraverso un ciclo
Mi ci è voluto un attimo per capire come funzionasse ma alla fine eccola qua la funzioncina che preleva i ricoveri di un paziente del mio progetto di basi (che ritornerà ad esser scaricabile non appena avrò passato l'esame):
create or replace function dati_ricovero(varchar) returns setof ricovero as $$
DECLARE
t ricovero%ROWTYPE;
BEGIN
FOR t IN
select r.*
from ricovero r,account_pazienti u,paziente p
where u.codiceweb=p.codiceweb AND u.username=$1
AND p.ssn=r.ssn
LOOP
RETURN NEXT t;
END LOOP;
END;
$$ LANGUAGE 'plpgsql';
18:32 | Categorie: PostgreSQL, SQL | 0 Comments
PostgreSQL e la funzione sleep
In questa pagina vien emostrato come costruire una funzione plpgsql che simuli una sleep tramite un ciclo oppure usare la sleep di PERL avendo questo linguaggio a bordo e avendo caricato la libreria con CREATE LANGUAGE.
create or replace function sleep (numeric) returns time as '
declare
seconds alias for $1;
later time;
thetime time;
begin
thetime := timeofday()::timestamp;
later := thetime + (seconds::text || '' seconds'')::interval;
loop
if thetime >= later then
exit;
else
thetime := timeofday()::timestamp;
end if;
end loop;
return null;
end;
' language plpgsql;
18:14 | Categorie: PostgreSQL, SQL | 0 Comments
Visual explanation of SQL join
Se avete dei dubbi sull'uso del JOIN in SQL (e le sue varie forme come INNER JOIN,LEFT OUTER JOIN e via dicendo) consiglio di vedere questo bel post di coding horror,che dà una spiegazione insiemistica del loro funzionamento. Sinceramente non ho mai usato tutte le varianti del JOIN,ancora non ne ho avuto bisogno :)
10:34 | Categorie: SQL | 0 Comments
SQL:tutorial e documentazioni
Dopo di che è il caso di cercarsi tutorial o leggerse libri al riguardo:
Un altro editor è WWW SQL Designer,che agisce via browser dopo aver settato connessioni al database.
11:16 | Categorie: MySQL, PostgreSQL, SQL | 0 Comments
Approfondimenti su SQL Injection
Sul mio sito di appunti,potete trovare un riassuntino abbastanza esaustivo su quest'argomento,comprensivo di svariate fonti,tra le quali spicca come al solito Wikipedia. Infatti l'enciclopedia libera mi ha fornito una gran serie di link. Per chi non avesse voglia di vedere il mio riassuntino,puà vedere le fonti che lo hanno interessato qui sotto:
17:01 | Categorie: Sicurezza, SQL | 0 Comments