Verständnisproblem mit der Python DB API

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

ich habe mir PEP 249 und die sqlite3 Doku zum Thema "Rollbacks" durchgelesen, aber scheinbar nicht richtig verstanden:

Angenommen, man hat folgenden Python Code:

Code: Alles auswählen

import sqlite3
con = sqlite3.connect('db.sqlite3')
cur = con.cursor()
cur.execute("""CREATE TABLE demo_table (
            id INT(3) NOT NULL,
            name VARCHAR(30) NOT NULL
            );""")
con.rollback()
con.close()
Da würde ich erwarten, das entweder die Datei 'db.sqlite3' erst garnicht existiert oder zumindest leer ist. Das mache ich an folgenden Beschreibungen fest:

PEP 249:
In case a database does provide transactions this method causes the database to roll back to the start of any pending transaction. Closing a connection without committing the changes first will cause an implicit rollback to be performed.
Demnach sollte das explizite 'con.rollback()' sogar weggelassen werden können um dasselbe Ergebnis zu erhalten, da 'con.close()' ohne voriges .commit das impliziert.

Zudem wird in der sqlite3 Doku dieses Modul als "Rollback capable" beschrieben; es kommt ja auch nicht, wie in der PEP 249 beschrieben zu einer Exception oder einem AttributeError, was dieses ebenfalls unterstreicht.

Dennoch existiert anschließend diese Struktur in der Datei, wie folgende Ausgabe des sqlite3 Tools zeigt:

Code: Alles auswählen

$ sqlite3 
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open db.sqlite3
sqlite> .schema demo_table
CREATE TABLE demo_table (
            id INT(3) NOT NULL,
            name VARCHAR(30) NOT NULL
            );
sqlite> 
Warum wird diese Tabelle trotz nachfolgendem Rollback also trotzdem angelegt und persistent gespeichert?
Zuletzt geändert von Anonymous am Dienstag 25. Oktober 2016, 21:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Judge: Transaktionen beziehen sich nicht auf den DDL-Teil („Data Definition Language“) von SQL, also alles was mit der Definition des Datenbankschemas zu tun hat. Ist nicht nur bei SQLite3 so. Auch bei anderen SQL-Datenbanken beziehen sich Transaktionen üblicherweise nur auf den „Data Manipulation Language“ (DML) Teil von SQL.
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hi BlackJack,

danke für die Erklärung und für's editieren meines Beitrages um die codebox.
Antworten