Libreria
Database
Database SQLite: tabelle, ricerche e dati che restano.
Funzioni 4
apri_database(percorso = ":memory:")#
Apre un database SQLite (lo crea se il file non c'è).
Senza percorso il database vive solo in memoria e sparisce alla fine del programma.
variabile db = apri_database("negozio.db")variabile db = apri_database("prova.db") # valore di provadb.crea_tabella("alunni", {"nome": "testo"})variabile db = apri_database("prova.db") # valore di provadb.inserisci("alunni", {"nome": "Ada"})variabile db = apri_database("prova.db") # valore di provadb.cerca("alunni")variabile db = apri_database("prova.db") # valore di provadb.chiudi()crea_database(percorso = ":memory:")#
Sinonimo di apri_database.
Se il file esiste già lo apre senza cancellare niente.
variabile db = crea_database("scuola.db")database_di_esempio()#
Un database in memoria già pieno, per fare prove senza rompere niente.
Ha le tabelle classi (nome, aula), alunni (nome, cognome, classe_id, nato) e voti (alunno_id, materia, voto); sparisce alla fine del programma.
variabile db = database_di_esempio()variabile db = apri_database("prova.db") # valore di provadb.stampa_tabella("alunni")e_database(percorso)#
vero se il file esiste ed è un database SQLite.
se e_database("scuola.db") allora variabile db = apri_database("scuola.db") fineOggetto «database»
Un database SQLite aperto da un programma Leo.
| Proprietà | Significato |
|---|---|
aperto | |
in_transazione | |
percorso |
.aggiorna(tabella, condizioni, valori, tutte = falso)#
Cambia i valori delle righe scelte.
Restituisce quante righe sono cambiate. Senza condizioni serve tutte = vero (protezione contro gli sbagli).
variabile db = apri_database("prova.db") # valore di provadb.aggiorna("studenti", {"nome": "Ada"}, {"età": 21}).aggiungi_colonna(tabella, nome, tipo = "testo", predefinito = nulla)#
Aggiunge una colonna a una tabella che esiste già.
Le righe che ci sono già ricevono il valore predefinito (o nulla). Una colonna obbligatorio ha bisogno di un predefinito.
variabile db = apri_database("prova.db") # valore di provadb.aggiungi_colonna("alunni", "promosso", "sì/no", predefinito = falso).annulla()#
Annulla le modifiche fatte da inizia_transazione() in poi.
.cerca(tabella, condizioni = nulla, ordina = "", limite = 0)#
Le righe che rispettano le condizioni.
Il risultato è una lista di dizionari. Condizioni: {"nome": "Ada"} (uguale), {"età": [">", 18]}, {"nome": ["contiene", "an"]}, {"voto": ["tra", 18, 30]}, {"città": ["in", ["Roma", "Milano"]]}; più condizioni valgono tutte insieme. Le condizioni di uguaglianza si possono scrivere anche per nome: db.cerca("alunni", classe = "5A"). Ordinamento: "nome", "età discendente", "cognome, nome".
variabile db = apri_database("prova.db") # valore di provadb.cerca("studenti", {"età": [">=", 18]}, ordina = "nome", limite = 10).cerca_testo(tabella, testo, colonne = nulla, ordina = "", limite = 0)#
Le righe che contengono le parole cercate.
Ogni parola deve comparire in almeno una colonna; maiuscole e accenti non contano ("citta" trova "Città"). Senza colonne cerca in tutte le colonne di testo.
variabile db = apri_database("prova.db") # valore di provadb.cerca_testo("libri", "principe piccolo", colonne = ["titolo", "autore"]).chiudi()#
Chiude il database (le modifiche sono già salvate). Chiamarlo due volte non è un errore.
.colonne(tabella)#
Dizionario colonna -> tipo (per esempio {"id": "intero", "nome": "testo"}).
.compatta()#
Riordina il file del database e lo rende più piccolo dopo tante cancellazioni.
Restituisce quanti byte ha risparmiato (0 per un database in memoria).
variabile db = apri_database("prova.db") # valore di provastampa(db.compatta()).conferma()#
Salva le modifiche della transazione aperta con inizia_transazione().
.conta(tabella, condizioni = nulla)#
Quante righe rispettano le condizioni (tutte, senza condizioni).
variabile db = apri_database("prova.db") # valore di provadb.conta("studenti", {"età": ["<", 18]})variabile db = apri_database("prova.db") # valore di provadb.conta("alunni", classe = "5A").conta_per(tabella, colonna, condizioni = nulla)#
Dizionario valore -> quante righe hanno quel valore.
variabile db = apri_database("prova.db") # valore di provastampa(db.conta_per("alunni", "classe")).copia_di_sicurezza(percorso)#
Salva una copia completa del database in un altro file.
Funziona anche mentre il database è in uso; le modifiche di una transazione non ancora confermata non entrano nella copia. Restituisce il percorso.
variabile testo = "Leo parla italiano" # valore di provavariabile db = apri_database("prova.db") # valore di provadb.copia_di_sicurezza("copie/scuola_" + testo(oggi()) + ".db").copia_tabella(origine, nuova, condizioni = nulla)#
Crea nuova con le stesse colonne e ci copia le righe.
Restituisce quante righe ha copiato; con le condizioni copia solo quelle righe.
variabile db = apri_database("prova.db") # valore di provadb.copia_tabella("alunni", "alunni_5A", classe = "5A").crea_indice(tabella, colonne, unico = falso)#
Rende più veloci le ricerche su quelle colonne.
Con unico = vero impedisce anche i valori ripetuti. Restituisce il nome dell'indice. Serve con tabelle grandi (migliaia di righe).
variabile db = apri_database("prova.db") # valore di provadb.crea_indice("alunni", ["cognome", "nome"]).crea_tabella(nome, colonne)#
Crea la tabella se non c'è già.
colonne è un dizionario nome -> tipo: intero, decimale, testo, logico, seguiti se vuoi da chiave, obbligatorio, unico. Se non c'è una colonna id Leo ne aggiunge una automatica.
variabile db = apri_database("prova.db") # valore di provadb.crea_tabella("studenti", {"nome": "testo obbligatorio", "età": "intero", "email": "testo unico"}).distinti(tabella, colonna, condizioni = nulla)#
I valori diversi di una colonna, in ordine, senza ripetizioni.
I valori vuoti (nulla) non ci sono.
variabile db = apri_database("prova.db") # valore di provastampa(db.distinti("alunni", "classe")).elimina(tabella, condizioni, tutte = falso)#
Cancella le righe scelte e dice quante erano.
Senza condizioni serve tutte = vero (oppure usa svuota).
variabile db = apri_database("prova.db") # valore di provadb.elimina("studenti", {"id": 3}).elimina_duplicati(tabella, colonne = nulla)#
Toglie le righe ripetute (tiene la prima) e dice quante ha tolto.
Due righe sono ripetute se hanno uguali tutte le colonne (tranne l'id), oppure le colonne indicate.
variabile db = apri_database("prova.db") # valore di provadb.elimina_duplicati("iscritti", colonne = ["email"]).elimina_tabella(nome)#
Cancella la tabella con tutte le sue righe.
Restituisce vero se la tabella c'era, falso se non esisteva.
.esegui(sql, parametri = nulla)#
Esegue un comando SQL e restituisce le righe (lista di dizionari).
I valori vanno SEMPRE nei parametri, mai incollati nel testo: ? con una lista oppure :nome con un dizionario.
variabile db = apri_database("prova.db") # valore di provadb.esegui("SELECT città, COUNT(*) AS quanti FROM studenti WHERE età > ? GROUP BY città", [18])variabile db = apri_database("prova.db") # valore di provadb.esegui("UPDATE prodotti SET prezzo = prezzo * :k", {"k": 1.1}).esiste(tabella, condizioni = nulla)#
vero se c'è almeno una riga che rispetta le condizioni.
variabile db = apri_database("prova.db") # valore di provase db.esiste("alunni", nome = "Ada") allora stampa("trovata") fine.esiste_tabella(nome)#
vero se nel database c'è la tabella nome.
variabile db = apri_database("prova.db") # valore di provase non db.esiste_tabella("alunni") allora db.crea_tabella("alunni", {"nome": "testo"}) fine.esporta_csv(tabella, percorso, separatore = ",", condizioni = nulla, ordina = "")#
Salva le righe in un file CSV.
La prima riga del file ha i nomi delle colonne. Restituisce quante righe ha scritto.
variabile db = apri_database("prova.db") # valore di provadb.esporta_csv("studenti", "studenti.csv", separatore = ";").esporta_json(tabella, percorso, condizioni = nulla, ordina = "")#
Salva le righe in un file JSON (lista di dizionari).
Restituisce quante righe ha scritto; le date diventano testi come "25/09/2026".
variabile db = apri_database("prova.db") # valore di provadb.esporta_json("alunni", "alunni.json", ordina = "cognome").importa_csv(percorso, tabella, separatore = nulla)#
Aggiunge alla tabella le righe di un file CSV.
La prima riga del file deve avere i nomi delle colonne. Se la tabella non c'è la crea, indovinando i tipi (intero, decimale, logico o testo). Tutto o niente: con una riga sbagliata non inserisce nulla. Restituisce quante righe ha aggiunto.
variabile db = apri_database("prova.db") # valore di provadb.importa_csv("prodotti.csv", "prodotti").importa_json(percorso, tabella)#
Aggiunge alla tabella le righe di un file JSON (la crea se non c'è).
Il file deve contenere una lista di dizionari (come quelli scritti da esporta_json). Tutto o niente. Restituisce quante righe ha aggiunto.
variabile db = apri_database("prova.db") # valore di provadb.importa_json("alunni.json", "alunni").importa_righe(tabella, righe)#
Aggiunge alla tabella una lista di dizionari (la crea se non c'è).
Se la tabella non esiste Leo la crea indovinando i tipi (intero, decimale, logico, data, testo). Va anche una lista di liste con i nomi delle colonne nella prima. Tutto o niente. Restituisce quante righe ha aggiunto.
variabile db = apri_database("prova.db") # valore di provadb.importa_righe("pianeti", [{"nome": "Marte", "lune": 2}, {"nome": "Terra", "lune": 1}]).inizia_transazione()#
Da qui le modifiche restano in sospeso fino a conferma() o annulla().
.inserisci(tabella, riga)#
Aggiunge una riga e restituisce il suo id.
riga è un dizionario colonna -> valore; con una lista di dizionari le inserisce tutte (tutte o nessuna, se una è sbagliata) e restituisce la lista degli id.
variabile db = apri_database("prova.db") # valore di provavariabile id = db.inserisci("studenti", {"nome": "Ada", "età": 20}).inserisci_o_aggiorna(tabella, riga, chiave = "id")#
Aggiorna la riga con la stessa chiave, oppure la aggiunge.
chiave è la colonna (o la lista di colonne) che riconosce la riga. Restituisce l'id della riga.
variabile db = apri_database("prova.db") # valore di provadb.inserisci_o_aggiorna("punteggi", {"giocatore": "Ada", "punti": 120}, chiave = "giocatore").massimo(tabella, colonna, condizioni = nulla)#
Il valore più grande della colonna (nulla se non ci sono righe).
variabile db = apri_database("prova.db") # valore di provadb.massimo("voti", "voto", materia = "matematica").media(tabella, colonna, condizioni = nulla)#
La media dei numeri di una colonna (nulla se non ci sono righe).
I valori vuoti non contano.
variabile db = apri_database("prova.db") # valore di provadb.media("voti", "voto", materia = "storia").minimo(tabella, colonna, condizioni = nulla)#
Il valore più piccolo della colonna (nulla se non ci sono righe).
Funziona con numeri, testi (ordine alfabetico) e date.
variabile db = apri_database("prova.db") # valore di provadb.minimo("alunni", "nato").pagina(tabella, numero, per_pagina = 10, condizioni = nulla, ordina = "")#
Le righe della pagina numero (da 1).
Serve per mostrare tante righe un po' alla volta.
variabile db = apri_database("prova.db") # valore di provadb.pagina("libri", 2, per_pagina = 20, ordina = "titolo").primo(tabella, condizioni = nulla, ordina = "")#
La prima riga trovata, o nulla se non ce n'è.
variabile db = apri_database("prova.db") # valore di provavariabile s = db.primo("studenti", {"email": "ada@esempio.it"})variabile db = apri_database("prova.db") # valore di provadb.primo("studenti", email = "ada@esempio.it").raggruppa(tabella, per, calcola = {"quanti": "conta"}, condizioni = nulla, ordina = "")#
Un riassunto per gruppi.
per è la colonna (o la lista di colonne) che forma i gruppi; calcola dice cosa calcolare per ogni gruppo: nome del risultato -> "conta", "somma COLONNA", "media COLONNA", "minimo COLONNA", "massimo COLONNA" o "distinti COLONNA". Il risultato è una lista di dizionari.
variabile db = apri_database("prova.db") # valore di provadb.raggruppa("voti", "materia", calcola = {"media": "media voto", "quanti": "conta"}).riga(tabella, id)#
La riga con quell'id (la chiave della tabella), o nulla se non c'è.
variabile db = apri_database("prova.db") # valore di provavariabile ada = db.riga("alunni", 1)stampa(ada["nome"]).riga_a_caso(tabella, condizioni = nulla)#
Una riga scelta a caso (o nulla se non ce ne sono).
Ottima per i quiz.
variabile db = apri_database("prova.db") # valore di provavariabile domanda = db.riga_a_caso("domande", livello = 1).rinomina_colonna(tabella, vecchio, nuovo)#
Cambia il nome di una colonna (i valori restano).
variabile db = apri_database("prova.db") # valore di provadb.rinomina_colonna("alunni", "eta", "età").rinomina_tabella(vecchio, nuovo)#
Cambia il nome di una tabella (le righe restano).
variabile db = apri_database("prova.db") # valore di provadb.rinomina_tabella("studenti", "alunni").somma(tabella, colonna, condizioni = nulla)#
La somma dei numeri di una colonna (0 se non ci sono righe).
variabile db = apri_database("prova.db") # valore di provadb.somma("spese", "euro", mese = "marzo").stampa_tabella(tabella, condizioni = nulla, ordina = "", limite = 20)#
Stampa le righe come una tabella con i bordi.
Al posto del nome della tabella puoi dare una lista di righe (per
variabile db = apri_database("prova.db") # valore di provadb.stampa_tabella("alunni", classe = "5A", ordina = "cognome").struttura(tabella)#
Com'è fatta la tabella, colonna per colonna (lista di dizionari).
Ogni dizionario ha nome, tipo, obbligatorio, unico, chiave, collegata (la tabella collegata o nulla) e predefinito.
variabile db = apri_database("prova.db") # valore di provaper ogni c in db.struttura("alunni") fai stampa(c) fine.svuota(tabella)#
Cancella tutte le righe della tabella (la tabella resta) e dice quante erano.
variabile db = apri_database("prova.db") # valore di provadb.svuota("carrello").tabelle()#
I nomi delle tabelle, in ordine alfabetico.
.transazione(azione)#
Esegue la funzione azione tutta o niente.
Se dentro azione c'è un errore, tutte le modifiche fatte fin lì vengono annullate e l'errore prosegue; altrimenti vengono salvate. Restituisce il risultato di azione.
variabile db = apri_database("prova.db") # valore di provadb.transazione(funzione () db.aggiorna("conti", {"id": 1}, {"saldo": 50}) fine).trova(tabella, condizioni = nulla, ordina = "", limite = 0)#
Sinonimo di cerca.
variabile db = apri_database("prova.db") # valore di provadb.trova("prodotti", {"prezzo": ["<", 10]})variabile db = apri_database("prova.db") # valore di provadb.trova("alunni", classe = "5A").ultimo(tabella, condizioni = nulla, ordina = "")#
L'ultima riga (l'ultima inserita, o l'ultima nell'ordine dato).
Restituisce nulla se non ci sono righe.
variabile db = apri_database("prova.db") # valore di provadb.ultimo("messaggi")variabile db = apri_database("prova.db") # valore di provadb.ultimo("voti", ordina = "voto").unisci(tabella, altra, collega = nulla, condizioni = nulla, ordina = "", limite = 0, anche_senza = falso)#
Unisce le righe collegate di due tabelle.
Ogni riga di tabella si unisce alla riga di altra a cui è collegata. Leo trova da solo il collegamento se una colonna è collegato ALTRA oppure si chiama come classe_id (per la tabella classi); altrimenti scrivi collega = {"colonna_di_tabella": "colonna_di_altra"}. Le colonne di altra con lo stesso nome di una di tabella diventano altra_colonna (per
anche_senza = verovariabile db = apri_database("prova.db") # valore di provadb.unisci("alunni", "classi", ordina = "classi_nome, cognome").valore_sql(sql, parametri = nulla)#
Esegue un comando SQL e restituisce un solo valore (la prima colonna della prima riga).
Restituisce nulla se non ci sono righe. Come in esegui, i valori vanno nei parametri ?.
variabile voti = [7, 8, 6, 9] # valore di provavariabile db = apri_database("prova.db") # valore di provadb.valore_sql("SELECT MAX(voto) FROM voti WHERE materia = ?", ["storia"]).valori(tabella, colonna, condizioni = nulla, ordina = "")#
La lista dei valori di una sola colonna.
variabile db = apri_database("prova.db") # valore di provadb.valori("alunni", "nome", classe = "5A", ordina = "nome")