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: 2828
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: 5428
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.
long long ago; /* in a galaxy far far away */
Antworten