Seite 1 von 1

sqlite3 Kein ergebnis

Verfasst: Samstag 31. August 2019, 09:24
von DiscoveryFox
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.

Re: sqlite3 Kein ergebnis

Verfasst: Samstag 31. August 2019, 09:58
von noisefloor
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

Re: sqlite3 Kein ergebnis

Verfasst: Samstag 31. August 2019, 13:00
von __blackjack__
@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.