SQLite: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
(CLI-Befehle für sqlite notiert)
 
(10 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 2: Zeile 2:
 
* [[SpatiaLite]]
 
* [[SpatiaLite]]
 
* [[PostgreSQL]]
 
* [[PostgreSQL]]
 +
  
 
== Über SQLite ==
 
== Über SQLite ==
Zeile 8: Zeile 9:
 
Datenbanksystem, DBS, Software). Sie wird u.a. in der Mobile Plattform und dem Betriebssystem Android eingesetzt und von [[QGIS]] unterstützt.  
 
Datenbanksystem, DBS, Software). Sie wird u.a. in der Mobile Plattform und dem Betriebssystem Android eingesetzt und von [[QGIS]] unterstützt.  
  
SQLite unterstützt einen Grossteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle. Unter anderem implementiert SQLite Transaktionen, Unterabfragen (subselects), Sichten (views), Trigger und benutzerdefinierte Funktionen. Es fehlen jedoch Funktionen wie Referentielle Integrität (FOREIGN KEY) oder die Möglichkeit, Objektberechtigungen zu verwalten (GRANT, REVOKE). Für alle wichtigen Programmiersprachen existieren passende Datenbankschnittstellen. Auch ein in der Konsole und in Shell-Skripten verwendbares, einfaches Frontend ist vorhanden.  
+
SQLite unterstützt einen Grossteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle. Unter anderem implementiert SQLite Transaktionen, Unterabfragen (subselects), Sichten (views), Trigger und benutzerdefinierte Funktionen. Für alle wichtigen Programmiersprachen existieren passende Datenbankschnittstellen. Auch ein in der Konsole und in Shell-Skripten verwendbares, einfaches Frontend ist vorhanden.
 +
 
 +
Es fehlen jedoch Funktionen wie Referentielle Integrität (FOREIGN KEY) oder die Möglichkeit, Objektberechtigungen zu verwalten (GRANT, REVOKE). Ganz speziell sind die "schwachen" Datentypen: Siehe unten.
  
Jede SQLite-Datenbank ist eine einfache Datei (typischerweise .sqlite), eine Client/Server-Architektur ist also nicht vorhanden. Es werden die Betriebssysteme Windows, Linux und MacOs unterstützt. Dazu kommt eine Erweiterung, ''[[SpatiaLite]]'' mit Geometrie-Datentypen.
+
Jede SQLite-Datenbank ist eine einfache Datei (typischerweise .sqlite). Eine Client/Server-Architektur ist also nicht vorhanden. Es werden die Betriebssysteme Windows, Linux und MacOs unterstützt. Dazu kommt eine Erweiterung, ''[[SpatiaLite]]'' mit Geometrie-Datentypen.
  
 
Die Daten können mit einem mitgelieferten Administrations-Tool (GUI) und vielen anderen DBMS-Admin-Tools (wie z.B. SQL Workbench) administriert werden. Dazu kommen Kommandozeilen-Tools.
 
Die Daten können mit einem mitgelieferten Administrations-Tool (GUI) und vielen anderen DBMS-Admin-Tools (wie z.B. SQL Workbench) administriert werden. Dazu kommen Kommandozeilen-Tools.
 +
 +
Was ist der Unterschied von SQLite zu [[PostgreSQL]]?
 +
# Architektur: SQLite ist eine In-Prozess-Datenbank mit einer einzigen Speicherdatei. PostgreSQL hat eine Client/Server-Architektur.
 +
# Datentypen: SQLite hat keine strengen Datentypen ('adaptative typing'. PostgreSQL hat striktes Data Typing zur Konsistenzsicherung.
 +
# SQL: SQLite und PostgreSQL sind nahe am SQL-Standard, wobei PostgreSQL mehr Funktionen anbietet (z.B. fehlt bei SQLite ALTER TABLE).
 +
# Lizenz: SQLite ist Public Domain. PostgreSQL hat eine BSD-Lizenz.
  
 
== SQLite Tools ==
 
== SQLite Tools ==
  
 
* SQLite Database Browser
 
* SQLite Database Browser
* tbd.
+
* Siehe auch: [[SpatiaLite]].
* Siehe auch: SpatiaLite.
 
  
== Notes ==
+
== Datentypen ==
  
SQLite does not really care about data-types:
+
SQLite besitzt ein eigenartiges, sog. dynamisches Typensystem: Die Deklaration im DDL-Statement wird wie Kommentar entgegengenommen. Was gilt ist der konkrete Wert. Das ist wie "duck typing" (d.h. der Typ folgt dem "Gebrauch") in [[Python]].
 +
 
 +
Man betrachte folgenes:
  
 
   CREATE TABLE abc (
 
   CREATE TABLE abc (
Zeile 37: Zeile 47:
 
   INSERT INTO abc (a, b, c)
 
   INSERT INTO abc (a, b, c)
 
     VALUES (3.3, 3, 'c');
 
     VALUES (3.3, 3, 'c');
 +
 
 +
  INSERT INTO abc (a, b, c)
 +
    VALUES ('d', 4.4, 4);
 
    
 
    
 
   SELECT a, b, c FROM abc;
 
   SELECT a, b, c FROM abc;
 +
 
 +
  SELECT ROWID, TypeOf(a), TypeOf(b),
 +
    TypeOf(c) FROM abc;
 +
 
 +
  PRAGMA table_info(abc);
 +
 
 +
  CREATE VIEW abc_v1 AS
 +
    SELECT * FROM abc;
 +
 
 +
  SELECT TypeOf(a), TypeOf(b),
 +
  TypeOf(c) FROM abc_v1;
 +
 
 +
  CREATE VIEW abc_v2 AS
 +
    SELECT CAST(a + 10 AS INTEGER) "a", b, c FROM abc;
 +
 
 +
  SELECT * FROM abc_v2;
 
    
 
    
 
   SELECT TypeOf(a), TypeOf(b),  
 
   SELECT TypeOf(a), TypeOf(b),  
    TypeOf(c) FROM abc;
+
  TypeOf(c) FROM abc_v2;
 +
 
 +
  SELECT TypeOf(a) as "type"
 +
    FROM abc_v1
 +
    WHERE type NOT NULL
 +
    GROUP BY 1;
 
    
 
    
   PRAGMA table_info(abc);
+
   PRAGMA table_info(abc_v2);
 +
 
 +
Siehe http://www.sqlite.org/datatype3.html und http://www.mail-archive.com/sqlite-users@sqlite.org/msg52027.html
 +
 
 +
== Notizen ==
 +
 
 +
Schema evolution: The unique operation supported by SQLite is: ALTER TABLE ... ADD COLUMN ... SQLite doesn't allows to change anything after creation. So, there is no way to fix: once you've initially created any column. See http://www.sqlite.org/lang_altertable.html
 +
 
 +
== Tipps ==
 +
 
 +
Optimierung:
 +
  PRAGMA journal_mode = OFF
 +
  -- Delete all indexes
 +
  If you need to create tables, do it here
 +
  BEGIN
 +
  -- ... do all your inserts
 +
  COMMIT
 +
  -- Create indexes
 +
  PRAGMA journal_mode = WAL
 +
 
 +
[[Kategorie:Datenbanksysteme]]
 +
[[Kategorie:SQLite]]
 +
 
 +
== CLI-Befehle ==
 +
 
 +
Datenbanken anzeigen:
 +
  .databases
 +
 
 +
Tabellen anzeigen:
 +
  .tables
  
The unique operation supported by SQLite is: ALTER TABLE ... ADD COLUMN ...
+
Spalten anzeigen:
SQLite doesn't allows to change anything after creation: http://www.sqlite.org/lang_altertable.html .
+
  PRAGMA table_info(mytable);
So, there is no way to fix: once you've initially created any column.
 
  
== Weblinks ==
+
Zeilen anzeigen
 +
  select * from mytable;
  
tbd.
+
Weitere Befehle siehe hier: http://www.sqlite.org/sqlite.html

Aktuelle Version vom 29. Oktober 2013, 08:58 Uhr

Siehe auch:


Über SQLite

SQLite ist eine bekannte, robuste, einfach zu nutzende und leichtgewichtige relationale "Embedded Datenbank" (bzw. Datenbanksystem, DBS, Software). Sie wird u.a. in der Mobile Plattform und dem Betriebssystem Android eingesetzt und von QGIS unterstützt.

SQLite unterstützt einen Grossteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle. Unter anderem implementiert SQLite Transaktionen, Unterabfragen (subselects), Sichten (views), Trigger und benutzerdefinierte Funktionen. Für alle wichtigen Programmiersprachen existieren passende Datenbankschnittstellen. Auch ein in der Konsole und in Shell-Skripten verwendbares, einfaches Frontend ist vorhanden.

Es fehlen jedoch Funktionen wie Referentielle Integrität (FOREIGN KEY) oder die Möglichkeit, Objektberechtigungen zu verwalten (GRANT, REVOKE). Ganz speziell sind die "schwachen" Datentypen: Siehe unten.

Jede SQLite-Datenbank ist eine einfache Datei (typischerweise .sqlite). Eine Client/Server-Architektur ist also nicht vorhanden. Es werden die Betriebssysteme Windows, Linux und MacOs unterstützt. Dazu kommt eine Erweiterung, SpatiaLite mit Geometrie-Datentypen.

Die Daten können mit einem mitgelieferten Administrations-Tool (GUI) und vielen anderen DBMS-Admin-Tools (wie z.B. SQL Workbench) administriert werden. Dazu kommen Kommandozeilen-Tools.

Was ist der Unterschied von SQLite zu PostgreSQL?

  1. Architektur: SQLite ist eine In-Prozess-Datenbank mit einer einzigen Speicherdatei. PostgreSQL hat eine Client/Server-Architektur.
  2. Datentypen: SQLite hat keine strengen Datentypen ('adaptative typing'. PostgreSQL hat striktes Data Typing zur Konsistenzsicherung.
  3. SQL: SQLite und PostgreSQL sind nahe am SQL-Standard, wobei PostgreSQL mehr Funktionen anbietet (z.B. fehlt bei SQLite ALTER TABLE).
  4. Lizenz: SQLite ist Public Domain. PostgreSQL hat eine BSD-Lizenz.

SQLite Tools

Datentypen

SQLite besitzt ein eigenartiges, sog. dynamisches Typensystem: Die Deklaration im DDL-Statement wird wie Kommentar entgegengenommen. Was gilt ist der konkrete Wert. Das ist wie "duck typing" (d.h. der Typ folgt dem "Gebrauch") in Python.

Man betrachte folgenes:

 CREATE TABLE abc (
   a potato NOT NULL,
   b tomato NOT NULL,
   c green_salad NOT NULL);
 
 INSERT INTO abc (a, b, c)
   VALUES (1, 'a', 1.1);
 
 INSERT INTO abc (a, b, c)
   VALUES (2, 'b', 2.2);
 
 INSERT INTO abc (a, b, c)
   VALUES (3.3, 3, 'c');
 
 INSERT INTO abc (a, b, c)
   VALUES ('d', 4.4, 4);
 
 SELECT a, b, c FROM abc;
  
 SELECT ROWID, TypeOf(a), TypeOf(b), 
   TypeOf(c) FROM abc;
 
 PRAGMA table_info(abc);
 
 CREATE VIEW abc_v1 AS 
   SELECT * FROM abc;
 
 SELECT TypeOf(a), TypeOf(b), 
  TypeOf(c) FROM abc_v1;
 
 CREATE VIEW abc_v2 AS 
   SELECT CAST(a + 10 AS INTEGER) "a", b, c FROM abc;
 
 SELECT * FROM abc_v2;
 
 SELECT TypeOf(a), TypeOf(b), 
  TypeOf(c) FROM abc_v2;
 
 SELECT TypeOf(a) as "type" 
   FROM abc_v1 
   WHERE type NOT NULL 
   GROUP BY 1;
 
 PRAGMA table_info(abc_v2);

Siehe http://www.sqlite.org/datatype3.html und http://www.mail-archive.com/sqlite-users@sqlite.org/msg52027.html

Notizen

Schema evolution: The unique operation supported by SQLite is: ALTER TABLE ... ADD COLUMN ... SQLite doesn't allows to change anything after creation. So, there is no way to fix: once you've initially created any column. See http://www.sqlite.org/lang_altertable.html

Tipps

Optimierung:

 PRAGMA journal_mode = OFF 
 -- Delete all indexes
 If you need to create tables, do it here
 BEGIN
 -- ... do all your inserts
 COMMIT
 -- Create indexes
 PRAGMA journal_mode = WAL

CLI-Befehle

Datenbanken anzeigen:

 .databases

Tabellen anzeigen:

 .tables

Spalten anzeigen:

 PRAGMA table_info(mytable);

Zeilen anzeigen

 select * from mytable;

Weitere Befehle siehe hier: http://www.sqlite.org/sqlite.html