====== SQLite ====== ===== Einrichtung ===== Test-Datenbank mit einer Test-Tabelle anlegen #!/usr/bin/env bash sqlite3 test.db "create table test (id int primary key, name text)" sqlite3 test.db "insert into test values (1, \"Fritz\")" sqlite3 test.db "select * from test" hier ist wichtig, dass alles klein geschrieben wird und das am Ende der Zeile __kein__ Semikolon steht, wie es bei SQL üblicherweise sein soll: > echo ".databases" | sqlite3 test.db > echo ".tables" | sqlite3 test.db * [[http://www.sqlite.org/lang.html]] Abfragebeispiel über zwei Tabellen: echo " SELECT Spalte1, strftime('%w',datum), Spalte3 FROM ${TABELLE1}, ${TABELLE2} WHERE netz1=netz2 AND id1=id2 AND DATUM BETWEEN date('now','start of month','-1 month','-0 day') AND date('now','start of month','+0 month','-1 day') GROUP BY 1, 2 ORDER BY 1, 2 DESC, 1 LIMIT 10 ; " | ${DBPROG} ${DBDATEI} > ${DATEN} **Das Semikolon am Ende eines SQL-Aufrufes ist sehr wichtig!** eine Pipe-separierte Datei mit höchstgeschwindigkeit einlesen echo " .import ${DATEN} ${TABELLE1} .separator | PRAGMA synchronous = 0; " | ${DBPROG} ${DBDATEI} ===== Syntax ===== # echo "SELECT * FROM sqlite_master;" | sqlite /var/lib/csync2/rechnername.db table|file|file|4|CREATE TABLE file ( filename, checktxt, UNIQUE ( filename ) ON CONFLICT REPLACE) index|(file autoindex 1)|file|3| table|dirty|dirty|6|CREATE TABLE dirty ( filename, force, myname, peername, UNIQUE ( filename, peername ) ON CONFLICT IGNORE) index|(dirty autoindex 1)|dirty|5| table|hint|hint|8|CREATE TABLE hint ( filename, recursive, UNIQUE ( filename, recursive ) ON CONFLICT IGNORE) index|(hint autoindex 1)|hint|7| table|action|action|10|CREATE TABLE action ( filename, command, logfile, UNIQUE ( filename, command ) ON CONFLICT IGNORE) index|(action autoindex 1)|action|9| table|x509_cert|x509_cert|12|CREATE TABLE x509_cert ( peername, certdata, UNIQUE ( peername ) ON CONFLICT IGNORE) index|(x509_cert autoindex 1)|x509_cert|11| alle Datenbanken anzeigen: # echo ".databases" | sqlite /var/lib/csync2/rechnername.db seq name file --- --------------- ---------------------------------------------------------- 0 main /var/lib/csync2/rechnername.db 1 temp /var/tmp/sqlite_gQiSCgZmz70zacs alle Tabellen anzeigen: # echo ".tables" | sqlite /var/lib/csync2/rechnername.db action dirty file hint x509_cert Tabellen mit dem Zeichen "i" im Namen anzeigen: # echo ".tables i" | sqlite /var/lib/csync2/rechnername.db action dirty file hint === Ausgabeformate === spaltenweise: # echo -e ".mode column\nSELECT * FROM dirty;" | sqlite /var/lib/csync2/rechnername.db /etc/ha.d/resource.d/csync2 1 store01 store02 /etc/hosts 1 store01 store02 /etc/vblade.conf 0 store01 store02 Die normale Spaltenbreite sind 10 Zeichen, Inhalte die länger sind, werden abgeschnitten. Man kann die Spaltenbreite aber auch verändern, in diesem Beispiel wird die Breite der ersten Spalte auf "30" Zeichen und die der zweiten Spalte auf "3" Zeichen gesetzt. Alle weiteren Spalten bleiben unverändert: # echo -e ".mode column\n.width 30 3\nSELECT * FROM dirty;" | sqlite /var/lib/csync2/ /etc/ha.d/resource.d/csync2 1 store01 store02 /etc/hosts 1 store01 store02 /etc/vblade.conf 0 store01 store02 als Liste: # echo -e ".mode list\nSELECT * FROM dirty;" | sqlite /var/lib/csync2/rechnername.db /etc/ha.d/resource.d/csync2|1|store01|store02 /etc/hosts|1|store01|store02 /etc/vblade.conf|0|store01|store02 zeilenweise # echo -e ".mode line\nSELECT * FROM dirty;" | sqlite /var/lib/csync2/rechnername.db filename = /etc/ha.d/resource.d/csync2 force = 1 myname = store01 peername = store02 filename = /etc/hosts force = 1 myname = store01 peername = store02 filename = /etc/vblade.conf force = 0 myname = store01 peername = store02 spezielles Trennzeichen: # echo -e ".separator ', '\nSELECT * FROM dirty;" | sqlite /var/lib/csync2/rechnername.db /etc/ha.d/resource.d/csync2, 1, store01, store02 /etc/hosts, 1, store01, store02 /etc/vblade.conf, 0, store01, store02