SqliteDict op een rij
Alles wat je in de lessen met SqliteDict doet, kort bij elkaar. De uitleg staat in zes lessen:
- Gegevens opslaan met SqliteDict
- Alles bekijken: len en items
- Bestaat de sleutel? in en get
- Verwijderen met del
- Een dictionary als waarde
- Een dictionary aanpassen: ophalen, aanpassen, terugzetten
Wat wil je doen?
Elke regel staat binnen een with SqliteDict("bestand.db") as db:-blok.
| Wat wil je | Code | Wat je terugkrijgt |
|---|---|---|
| Opslaan | db["naam"] = "Jan" | niets; pas na commit() staat het in het bestand |
| Wijzigingen bewaren | db.commit() | niets |
| Uitlezen | db["naam"] | de waarde, of een KeyError als de sleutel er niet is |
| Tellen | len(db) | het aantal sleutels |
| Alles langslopen | for sleutel, waarde in db.items(): | elke sleutel met zijn waarde |
| Alle waarden als lijst | list(db.values()) | een lijst die je ook na het with-blok kunt gebruiken |
| Kijken of een sleutel bestaat | "naam" in db | True of False |
| Uitlezen als hij misschien niet bestaat | db.get("naam", "onbekend") | de waarde, of "onbekend" |
| Verwijderen | del db["naam"] | niets, of een KeyError als de sleutel er niet is |
| Een dictionary opslaan | db["sara"] = {"klas": "4B"} | niets; pas na commit() staat hij in het bestand |
| Een veld van een dictionary aanpassen | ophalen, aanpassen, db["sara"] = sara | niets; zonder terugzetten blijft de oude waarde |
Zo ziet het er in een script uit
from sqlitedict import SqliteDict
with SqliteDict("mijn_data.db") as db:
db["sara"] = {"klas": "4B", "vakken": ["informatica"]}
db.commit()
with SqliteDict("mijn_data.db") as db:
if "sara" in db:
sara = db["sara"]
sara["vakken"].append("wiskunde")
db["sara"] = sara
db.commit()
print(len(db), "sleutels")
Anders dan een gewone dictionary
SqliteDict lijkt op een dictionary, maar op deze punten gedraagt hij zich anders. Elk punt is een fout die je anders vroeg of laat tegenkomt.
- Zonder
commit()is een wijziging weg zodra hetwith-blok sluit. Er komt geen foutmelding, ook niet alscommit()ná het blok staat. - Uitlezen geeft een kopie.
db["sara"]["klas"] = "5B"past een kopie aan. Haal de waarde op, pas hem aan en zet hem terug. - Buiten het
with-blok is de database dicht.db.values()endb.items()halen pas iets op als je erdoorheen loopt; doe je dat na het blok, dan krijg jeAttributeError: 'NoneType' object has no attribute 'select'. Maak er binnen het blok een lijst van metlist(). - Het bestand staat in de map van je terminal, niet per se naast je script. Bestaat het daar niet, dan maakt SqliteDict stil een lege database aan.
- Een sleutel is tekst. Sla je iets op onder het getal
1, dan komt de sleutel bijdb.items()terug als"1". Gebruik daarom altijd tekst als sleutel, zoalsf"bericht_{time.time_ns()}".
Alles bekijken wat erin staat
Het script uit Alles bekijken: len en items. Verander de bestandsnaam in de database die je wilt zien, zoals gastenboek.db:
from sqlitedict import SqliteDict
with SqliteDict("mijn_data.db") as db:
print(len(db), "sleutels")
for sleutel, waarde in db.items():
print(sleutel, "=", waarde)
Waar het in de cursus terugkomt
| Bestand | Wat erin staat | Les |
|---|---|---|
mijn_data.db | je eerste proeven, en later Sara met haar klas en vakken | Gegevens opslaan met SqliteDict tot en met Een dictionary aanpassen: ophalen, aanpassen, terugzetten |
namen.db | de laatst opgeslagen naam | Een formulier opslaan |
gastenboek.db | elk bericht onder een eigen sleutel, met een naam en een tekst | Elk bericht bewaren: een eigen sleutel |
gebruikers.db | per naam het wachtwoord van een account, nog leesbaar | Registreren: een account opslaan |
sessies.db | per sessie-id de naam waarmee iemand inlogde (uitbreiding) | Onthouden op de server: sessies |
Een fout die hier niet staat, vind je misschien bij Er gaat iets mis.