sqlite3 Kein ergebnis

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
DiscoveryFox
User
Beiträge: 1
Registriert: Samstag 31. August 2019, 09:14

Samstag 31. August 2019, 09:24

Hallo ich bin gerade dabei ein kleines Programm zu schreiben das in 2 teile aufgeteilt ist

Teil:

Code: Alles auswählen

import sqlite3


connection = sqlite3.connect("Web.db")
cursor = connection.cursor()

cursor.execute("""CREATE  TABLE contacts (ip Text, username TEXT, realname TEXT, online INTEGER)""") 

for row in (("1.1.1.1", "MarcReh_001", "Marc", 1),
       ("2.2.2.2", "JannisMaster555", "Jannis", 1),
       ("3.3.3.3", "DamiBug07", "Damian", 0),
       ("4.4.4.4", "Consti", "Konstantin", 0)):
    cursor.execute("INSERT INTO contacts VALUES(?, ?, ?, ?)",row) 
Teil 2:

Code: Alles auswählen

import sqlite3

connection = sqlite3.connect("Web.db")
cursor = connection.cursor()


cursor.execute("SELECT username FROM contacts")

print(cursor.fetchall())
Ich bekomme allerdings bei print(cursor.fetchall()) nur eine leere Liste angezeigt ich bin wirklich ratlos.
Benutzeravatar
noisefloor
User
Beiträge: 2739
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Samstag 31. August 2019, 09:58

Hallo,

du bekommst eine leere Liste, weil deine Datenbank leer ist. Grund: du führst die Schreiboperation in der DB nie aus, weil du kein `conneciton.commit()` ausführst.

Abgesehen davon solltest du den Cursor und die Verbindung schließen, wenn du fertig bist.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 4010
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 31. August 2019, 13:00

@DiscoveryFox: Ergänzend: Hier würde sich die `executemany()`-Methode zum Einfügen der Daten anbieten.

Bei der Tabellendefinition fehlt mir so etwas wie ein Primärschlüssel. Ich würde da eine künstliche ID einführen oder mindestens den Benutzernamen dafür verwenden. `online` ist semantisch keine Zahl sondern ein Wahrheitswert – das würde ich über die Typangabe deutlich machen. Und es fehlen wahrscheinlich noch ein paar NOT NULL.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing
import sqlite3


def main():
    with closing(sqlite3.connect("Web.db")) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute(
                "CREATE TABLE contact ("
                "ip TEXT NOT NULL,"
                "username TEXT PRIMARY KEY,"
                "realname TEXT NOT NULL,"
                "online BOOLEAN NOT NULL)"
            )
            rows = [
                ("1.1.1.1", "MarcReh_001", "Marc", 1),
                ("2.2.2.2", "JannisMaster555", "Jannis", 1),
                ("3.3.3.3", "DamiBug07", "Damian", 0),
                ("4.4.4.4", "Consti", "Konstantin", 0),
            ]
            cursor.executemany("INSERT INTO contacts VALUES(?, ?, ?, ?)", rows)

        connection.commit()


if __name__ == "__main__":
    main()
Last but not least: Ich verwende bei Datenbanken eigentlich fast immer SQLAlchemy für den Zugriff.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Antworten