Python a vložení slovníku{} do sqlite3

kotun

Python a vložení slovníku{} do sqlite3
« kdy: 25. 09. 2012, 08:55:12 »
Dobrý den,

mám dotaz již několik dní se snažím procházet dokumentaci k pythonu a sqlite3, abych mohl zapisovat složitější slovníky přímo do sqlite, aniž bych přišel o možnosti, které python dává. Dopředu ještě naznačím, že je možné že slovníky budou svojí strukturu měnit, případně, že vnitřní listy které obsahují jak hodnoty True, False, čísla nebo texty..

např.  slovnik
mujslovnik = { 'oznaceni' : "Atomik", 'cilovaPozice' : 12, 'overeniPozice' : [12, True, False], 'definovano' : True, 'typ' : ["A","letadlo"], 'spadneBrzo' : False}

a tento slovník např.  vložit dle jednotlivých klíčů (sloupce) do řádku databáze v nezměněných hodnotách. Primárně bych nechtěl, aby bylo nutné např definovat všechny pozice v listech, případně, aby nebylo možné upravit nějakou hodnotu např. číslo na pozdější list. Tyto parametry se předkládají jak funkci/třídě nebo podobné vypadnou při zpracování.

Z mé dosavadní zkušenosti, se mi nepodařilo, přímo zapsat tyto hodnoty, jelikož některé části se převedly na text cele a v případě textu a boolean hodnoty, již nebylo možné určit co je text a co není, nebo z celých listů se staly textové hodnoty. Z těchto výsledků pramení moje podezření, že to asi jen tak bez složitých machinací nepůjde. Například v této době požívám na ukládání dat modul pickle, který je naprosto perfektní, ale chtěl jsem něco více univerzálního. Výsledky mě dále vedou k tomu, že asi bude nutné spíše použít nějakou klíč:hodnota nosql databázi, abych se neobral o možnosti.
« Poslední změna: 25. 09. 2012, 10:20:26 od Petr Krčmář »


tadeas

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #1 kdy: 25. 09. 2012, 09:04:16 »
...že asi bude nutné spíše použít nějakou klíč:hodnota nosql databázi, abych se neobral o možnosti.
Tak tak. Pokud bys trval na SQL, tak to bude složitější. Problém nicméně nesouvisí s Pythonem ani SQLite, ale s tím, co je to relační databáze a jak se používá.

Jedna možnost je rozdělit to do více sloupců ala 'oznaceni', 'cilovaPozice', 'overeniPozice1', 'overeniPozice2',...

Druhá (čistší) možnost je udělat si další tabulky, např. tabulka 'overeniPozice', kde bude jeden sloupec klíč a v dalších třech sloupcích všechny kombinace hodnot, které můžou nastat v hlavní tabulce ve sloupci 'overeniPozice'. Tam by pak nebyl list, ale jenom číslo - klíč do té pomocné tabulky. Obdobně u dalších složených hodnot.

Nicméně pokud chceš ukládat přímo dict a nepotřebuješ v tom vyhledávat či výsledky třídit, tak to můžeš celé nebo po částech strčit do nějaké NoSQL.

kotun

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #2 kdy: 25. 09. 2012, 09:14:55 »
toho jsem se právě docela obával, jde mi o to, že již nyní je v aplikaci předpoklad o možných úpravách a zvětšení množství vnitřních listů...
Btw neexistuje krom Picklu nějaká databáze přímo pro python, která by tohle umožňovala, ale byla by bližší databázi? případně by se dodával s pythonem přímo modul? Co jsem se tak díval, tak hlavní výhodu pro sqlite, jsem bral že je integrální součástí distribuce pythonu.

z no sql jsem si našel pak CouchDB a MongoDB, ale všechny jsou od pythonu oddělené, což je škoda..

jinak děkuji za potvrzení mé domněnky :)

tadeas

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #3 kdy: 25. 09. 2012, 09:46:40 »
Při každé úpravě by byl potřeba alter a úprava kódu - takhle prostě relační databáze fungují. NoSQL mají zase svojí řádku nevýhod :) .

To, že databáze běží ve vlastním procesu není zas až tak na škodu. Administrace není o mnoho složitější a naopak se to dá snáze škálovat (pustit na jiném fyzickém stroji pro začátek), může se tam připojit víc procesů apod. Plus oddělené logování, snazší přístup k datům při debugování atd. atp.

Co se týče výběru NoSQL, tak tenhle odkaz by mohl trošku pomoct:
http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

V Pythonu by měly fungovat snad všechny (já mám zkušenosti jenom s Memcache a Redis), ale radši si to ještě ověř.

kotun

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #4 kdy: 25. 09. 2012, 10:28:56 »
Chtěl jsem databázi, která se spíše podobá sqlite (embeded, soubor), jelikož na každém stroji bude jiná a pravděpodobně bude vždy pro dané využití a asi by ani neměla být sdílená (pokud by byla tak spíše asi rsyncem/kopiíí, když bude potřeba) jelikož, každý uživatel bude jinde a bude mít svá oddělená data.
Cílem právě bylo ukládat celé vytvořené řetězce slovníků pro pozdější načtení/úpravu a nějaké základní vyhledávání (jen např celý slovník, nebo část slovníku), ale nic složitého, spíš je důležitý základní přehled a struktura.

Další věc jsou závislosti atd. chtěl bych co nejvíce se držet základní verze python, jelikož to přináší řadu problémů a zas tak nutně tu databázi nepotřebuji, pokud nepřidá více výhod.

Ale i tak, děkuji za ukázku možností. zatím to vypadá, že ještě nějakou dobu asi zůstanu i Picklu no, podívám se asi hlavně tedy na ten Redis a na CouchDB,


com

Re:Python a vložení slovníku{} do sqlite3
« Odpověď #5 kdy: 25. 09. 2012, 10:40:07 »
mohol by si vlozit pickle do binarneho Blobu. Zalezi ako velmi v tej databaze chces vyhladavat.

tadeas

Re:Python a vložení slovníku{} do sqlite3
« Odpověď #6 kdy: 25. 09. 2012, 10:54:09 »
Já jsem tak zblbej z toho, že řešim jenom server-side, že mi vůbec nedocvaklo, že to může běžet i u klientů :-) .

Nevidím žádný přínos vkládání pickle do binary blobu v sqlite - v čem je to výhodnější, než to přímo uložit do souboru?
Jinak na tohle mi připadá asi nejvhodnější prostě a jednoduše pickle, resp. shelve. Problém bude s vyhledáváním, ale to se dá řešit - navíc záleží na požadované rychlosti, třeba bude dostačující prostě všechny položky načíst a po jedné porovnat.

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #7 kdy: 25. 09. 2012, 11:14:18 »
pickle, který je naprosto perfektní, ale chtěl jsem něco více univerzálního [...] Btw neexistuje krom Picklu nějaká databáze přímo pro python, která by tohle umožňovala, ale byla by bližší databázi?
On je problém asi hlavně v tom, že nepíšeš, co ti na picklu nevyhovuje a co bys od nového řešení chtěl navíc/jinak. Obraty jako "víc univerzální" nebo "bližší databázi" jsou nicneříkající.

Pokud chceš někam ukládat strom nativních pythonovských struktur a nechceš vytvářet žádné schéma, tak těžko můžeš chtít např. nějaké jiné vyhledávání, než normální procházení stromu. To není otázka hledání vhodného produktu, ale selské úvahy, jestli víš, co vlastně chceš, a to, co chceš, je vůbec principielně proveditelné.

mikrom

Re:Python a vložení slovníku{} do sqlite3
« Odpověď #8 kdy: 25. 09. 2012, 11:15:32 »
Citace
v této době požívám na ukládání dat modul pickle, který je naprosto perfektní, ale chtěl jsem něco více univerzálního
Mozno by bolo zaujimave pouzit YAML. Poznam to z Ruby, ale v Pythone je to mozne tiez:
http://en.wikipedia.org/wiki/YAML
http://pyyaml.org/wiki/PyYAML
http://mikkel.elmholdt.dk/?p=4

kotun

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #9 kdy: 25. 09. 2012, 11:32:02 »
pickle, který je naprosto perfektní, ale chtěl jsem něco více univerzálního [...] Btw neexistuje krom Picklu nějaká databáze přímo pro python, která by tohle umožňovala, ale byla by bližší databázi?
On je problém asi hlavně v tom, že nepíšeš, co ti na picklu nevyhovuje a co bys od nového řešení chtěl navíc/jinak. Obraty jako "víc univerzální" nebo "bližší databázi" jsou nicneříkající.

Pokud chceš někam ukládat strom nativních pythonovských struktur a nechceš vytvářet žádné schéma, tak těžko můžeš chtít např. nějaké jiné vyhledávání, než normální procházení stromu. To není otázka hledání vhodného produktu, ale selské úvahy, jestli víš, co vlastně chceš, a to, co chceš, je vůbec principielně proveditelné.

Jediný problém, který na Picklu vidím, je že se těžko zapojuje do jiných aplikací. Proto jsem po picklu vybral sqlite, kde není problém jí např. otevřít hned v prohlížeči a data prohlédnout, případně vzít jinou aplikaci. Je to možná špatné řešení, ale v případě že je někdy potřeba data extrahovat do jiných aplikací, tak se mi vždy nejvíce osvědčilo CSV a nebo soubory, které jsou kompatibilní s nějakou formou excelovské struktury, jelikož často taková to data lze jednoduše přizpůsobit. Proto jsem zkoušel sqlite.

Další část souvisí s předpokladem, že někdy bude nutné data např. manuálně upravit, případně manuálně přečíst či prohlédnout bez nutnosti mít aplikaci a zde se v případě databáze např. sqlite3 není žádný problém, jelikož jak již jsem zmínil, je možné jí prohlédnout v jiných aplikacích bez problémů. V případě pickle a jeho textové formy, to je o trošku těžší, přeci jen z textové editoru se data vyčíst dají a i se dají zpracovat, ale už ne tak jednoduše. Jde tedy čistě jen o praktické možnosti.

kotun

Re:Python a vložení slovníku{} do sqlite3
« Odpověď #10 kdy: 25. 09. 2012, 11:42:07 »
Citace
v této době požívám na ukládání dat modul pickle, který je naprosto perfektní, ale chtěl jsem něco více univerzálního
Mozno by bolo zaujimave pouzit YAML. Poznam to z Ruby, ale v Pythone je to mozne tiez:
http://en.wikipedia.org/wiki/YAML
http://pyyaml.org/wiki/PyYAML
http://mikkel.elmholdt.dk/?p=4


Tohle vypadá naprosto skvěle, kouknu na to podrobněji a na možnosti vložení do distribuce, ale od prvního pohledu si myslím, že to je téměř to co bych si představoval, děkuji :)

Re:Python a vložení větveného slovníku{} do sqlite3
« Odpověď #11 kdy: 25. 09. 2012, 12:22:45 »
je že se těžko zapojuje do jiných aplikací. [...] někdy bude nutné data např. manuálně upravit
Jo, tak v tom případě by YAML mohl být dobrý. Já osobně ho mám hodně rád. Samozřejmě má ale zase svoje limity (ukecaný textový formát, otázka, jestli je mapování vůči pythonu 1:1 atd.) Jako vždycky, je to něco za něco :)