SQLite, Python und zu viel Text

  • Hallo liebe Boardmitglieder,

    ich kämpfe aktuell mal wieder mit einem Problem mit der Programmierung.

    :helpnew:

    Ich habe ein kleines Python Programm, welches eine Datenbank erzeugt bzw. wenn vorhanden nutzt.
    Verwendet wird Python3 und Sqlite auf der Shellebene.

    Es wird eine Datenbank mit folgenden Werten erstellt:

    Code
    try:
           sql = "CREATE TABLE verlauf2(" \
           "nummer INTEGER PRIMARY KEY, " \
           "nick TEXT, " \
           "verl BLOB, " \
           "datum INTEGER)"
           cursor.execute(sql)
    except:
           print("Datenbank geladen")

    Gedacht ist es als eine Art Chatverlauf bzw. Ticketsystem.
    Anwender vergibt (aktuell noch) eine laufende Nummer, gibt den Nutzer an und kopiert den Text aus einem anderen Fenster (inklusive Zeilenschaltung usw) und danach noch das aktuelle Datum.
    Hierfür nutze ich folgenden Code

    Code
    nummer = input("Nummer: ")
    nick = input("Wer schrieb: ")
    verl = input("Text: ")
    datum = datetime.strptime(input("Datum: "), "%d.%m.%Y")
    
    
    sql = 'INSERT INTO verlauf2 VALUES (?, ?, ?, ?)'
    args = (nummer, nick, verl, datum)
    cursor.execute(sql, args)
    connection.close()

    Bei kurzem Text, funktioniert alles. Wenn ich jedoch Text nehme, der etwas länger ist (genau habe ich es noch nicht herausfinden können wie lange) läuft wohl der Speicher voll, bzw erkennt die INPUT Abfrage eine Zeilenschaltung und schreibt nicht weiter in die Datenbank.

    Ich habe jetzt mal folgenden Beispieltext erzeugen lassen um den Fehler euch mit neutralem Text zu zeigen:


    Lorem ipsum dolor sit amet, dico libris altera ut vim, solum salutatus id vis? Fabulas commune detracto pro te, no ubique ceteros sea? Te denique scripserit vis, ut agam vivendum sed. Zril utinam gloriatur vim te! Ex quo prompta neglegentur, eum ne quot clita, harum eripuit volumus eu has.

    Ea pri hinc commodo, cu duo magna posse! Ius ei aliquando tincidunt. Quo illum paulo mandamus cu, ne his scaevola appetere, mundi libris eleifend qui no? Te mollis meliore his. Illum quidam expetenda te nam, ex nec explicari liberavisse. At tale alia commune pri?

    Vix et eirmod praesent definiebas, ferri epicurei suscipiantur per an, his sanctus mentitum an! Ne audire appareat sea. Cu pro accusam epicuri, elitr exerci et est! Ad eos aliquam vituperatoribus.

    Possim praesent et mei, scripta labitur in cum. Percipit reprimique cu mei. Sea et omittam scripserit, sit tantas feugiat eu, vim legere posidonium at! Ne has menandri incorrupte, id pro duis tation?


    In der Shell kommt dann dieses bei mir raus:


    Habe ich einfach zu viel Text, oder liegt in der Formatierung das Problem?

    Vielleicht kann mir jemand einen Hinweis geben, wie ich das Problem umgehen kann.
    Später soll das Programm auf einer Webseite aufgerufen werden können, der Primary Key soll sich selbst erstellen und auch das aktuell Datum inklusive Zeitstempel der Aufnahme.

    Rein der Text und der Nutzer sollen vom Anwender noch eingetragen werden müssen.

    Sollte das Problem mit Sqlite bestehen, kann ich auf auf eine Mysql Datenbank bei einem Provider ausweichen.
    Wenn Python das Problem ist, habe ich ein Problem. Mit anderen Sprachen, habe ich nämlich dies nicht realisieren können. Ursprünglich war gedacht es mit reinenem PHP zu erstellen.


    Danke und Grüße aus Oberfranken
    Chris

    • Offizieller Beitrag

    Er sagt

    Code
    time data '' does not match format '%d.%m.%Y'

    Warsscheinlich stimt was mit deinem Datum bzw. dessen formatierung nicht. In diesem Fall scheint das Datum komplett zu fehlen

  • Um herauszufinden woran es genau liegt würde ich das mal umdrehen:


  • Er sagt

    Code
    time data '' does not match format '%d.%m.%Y'

    Warsscheinlich stimt was mit deinem Datum bzw. dessen formatierung nicht. In diesem Fall scheint das Datum komplett zu fehlen

    Die Abfrage von Date kommt hier gar nicht mehr! Wie oben schon geschrieben, die Funktion bei kurzem Text läuft normal!
    Ich werde mal meigrafd seinen Vorschlag testen.


  • Um herauszufinden woran es genau liegt würde ich das mal umdrehen:

    Was mich nur etwas verwundert, warum fängt er plötzlich mit HTML überhaupt an?
    Es findet ja keinerlei HTML Abfrage/Übergabe im Python statt, oder liegt das an der Programmiersprache an sich?
    Deshalb habe ich die komplette Ausgabe gepostet.

    Nach deinen Veränderungen meigrafd kommt jetzt zwar keine Fehlermeldung mehr vom Datum, trotzdem läuft bei der Übergabe etwas falsch, denn auch hier wird der Text nicht komplett übergeben!
    Die Datenbank bleibt leer, da vor dem Schreiben das Programm schon abbricht.


  • Das Problem ist ganz simpel: input liest bis zum auftreten des ersten Zeilenumbruchs. Es ist also fuer deinen Zweck nicht geeignet. Alles andere sind Folgefehler.


  • wenn der Fehler lautet "time data does not match" kannst du nicht sagen das die abfrage von Date nicht mehr kommt.. Es besteht ein Problem mit dem Datum Punkt. Das hat meigrafd auch erkannt und einen estansatz gepostet.

    Das Datum kommt, aber durch den Fehler der im Text bereits entsteht!
    Er ignoriert irgendwann den Text, macht einen Sprung und geht im Datum weiter.
    Hier kommt jetzt Text und deshalb sagt er "Format falsch"

  • Und bezueglich des HTML-Fehlers: du hast uns nicht das ganze Skript gezeigt, oder? Von alleine passiert das naemlich bestimmt nicht - aber zB bei Verwendung des CGI-Moduls.

  • Naja deets hat schon Recht. guck dir den Verlauf noch mal in ruhe an:

    Code
    Datenbank geladen
    Nummer: 44
    Wer schrieb: ípsum
    Text: Lorem ipsum dolor sit amet, dico libris altera ut vim, solum salutatus id vis? Fabulas commune detracto pro te, no ubique ceteros sea? Te denique scripserit vis, ut agam vivendum sed. Zril utinam gloriatur vim te! Ex quo prompta neglegentur, eum ne quot clita, harum eripuit volumus eu has.
    
    
    Datum: Ea pri hinc commodo, cu duo magna posse! Ius ei aliquando tincidunt. Quo illum paulo mandamus cu, ne his scaevola appetere, mundi libris eleifend qui no? Te mollis meliore his. Illum quidam expetenda te nam, ex nec explicari liberavisse. At tale alia commune pri?

    Der Zeilenumbruch wird als Eingabe bzw ENTER erkannt und folglich landet die nächste Zeile in der "Datum:" Eingabezeile... daraus resultiert dann der Fehler das "text" kein Datum ist....

    Daraus resultiert wiederum das auch mein obiger Vorschlag nicht funktionieren wird da nach einer Zeile Schluss sein wird.

    Versuch es stattdessen mal mit:
    [code=php]
    lines = []
    while True:
    line = input()
    if line:
    lines.append(line)
    else:
    break
    text = '\n'.join(lines)
    [/php]Oder:
    [code=php]
    print("Enter as many lines of text as you want.")
    print("When you're done, enter a single period on a line by itself.")

    buffer = []
    while True:
    print("> ", end="")
    line = input()
    if line == ".":
    break
    buffer.append(line)
    multiline_string = "\n".join(buffer)

    print("You entered...")
    print()
    print(multiline_string)
    [/php]

    Google Suche nach: python3 input multiline


  • Und bezueglich des HTML-Fehlers: du hast uns nicht das ganze Skript gezeigt, oder? Von alleine passiert das naemlich bestimmt nicht - aber zB bei Verwendung des CGI-Moduls.

    Doch es war der ganze Code, bis auf die Intialisierung des Datenbank und Import Date... usw.


    Deshalb hatte ich ja bereits in der Eröffnung gefragt, ob ich überhaupt mit dem richtigen Ansatz ran gehe.
    Gibt es denn dann eine Formatierung die ich nutzen kann um die Daten zu übergeben? Abgesehen von Import, welches ja nicht funktioniert?

    Zeilenschaltung muss leider vorhanden sein, da sonst der Kontext oft fehlt und beim Lesen zu schwierig wäre.

  • Zeig bitte trotzdem das ganze Modul.

    Und was heisst 'abgesehen von import, das ja nicht funktioniert'?

    Generell kann man natuerlich auf vielfaeltige Arten und Weisen Daten einlesen - ich sehe nur nicht, was das zum jetzigen Zeitpunkt bringen soll. Wenn das Ziel eine Einbindung in eine in Python geschriebene Webanwendung ist, dann bekommst du dort die Daten in einer Python-Datenstruktur, zb einem Request-Objekt. Sich da jetzt wild zu ueberlegen, wie man mehrzeiligen Input prozessiert ist also wertfrei.

    Wenn du statt Python PHP fuer die Webanwendung verwenden willst, solltest du die Datenbankoperationen auch gleich in PHP machen.


  • Zeig bitte trotzdem das ganze Modul.

    Und was heisst 'abgesehen von import, das ja nicht funktioniert'?

    Generell kann man natuerlich auf vielfaeltige Arten und Weisen Daten einlesen - ich sehe nur nicht, was das zum jetzigen Zeitpunkt bringen soll. Wenn das Ziel eine Einbindung in eine in Python geschriebene Webanwendung ist, dann bekommst du dort die Daten in einer Python-Datenstruktur, zb einem Request-Objekt. Sich da jetzt wild zu ueberlegen, wie man mehrzeiligen Input prozessiert ist also wertfrei.

    Wenn du statt Python PHP fuer die Webanwendung verwenden willst, solltest du die Datenbankoperationen auch gleich in PHP machen.

    So Asche auf mein Haupt, ich hatte wirklich von einem Versuch davor noch

    import cgitb
    cgitb.enable()

    im Code stehen. Durch den Fehler der Zeilenschaltung bin aber immer weiter unten stehen geblieben und hatte die Importierung von cgitb ausgeblendet.
    Import wurde jetzt mal raus geworfen und der Code mal mit der mehrzeiligen Eingabe getestet.
    Jedoch Stand Alone und muss jetzt nur noch in die Datenbank gebracht werden.

    Den ganzen Code kann ich später erst veröffentlichen. Ich komme aktuell nicht per Fernzugriff auf das System.


    Wenn ich das zweite Programm hier richtig verstehe, dann läuft die Abfrage so lange, bis am Ende ein einzelner Punkt eingereicht wurde.

    Alle Eingaben wandern in den Puffer und werden im "multiline_string" hinterlegt!?

    Kann ich diesen "multiline_string" nutzen um den Wert in der Datenbank abzulegen?


    Danke schon mal für eure Hilfe und Geduld mit mir ;)

  • Nochmal: die Loesung, mehrere Zeilen ueber die Kommandozeile einzulesen ist nicht hilfreich auf dem Weg, dein Problem der Dateneingabe ueber das Web zu loesen. Dort bekommst du die Werte inklusive Zeilenumbrueche in einer Variablen. Fuer das rumspielen mit den Daten und das ausprobieren von Datenbank-Code reicht deine urspruengliche Loesung also voellig - kann halt keine Mehrzeiler, aber was soll's. Weder HTTP noch die Datenbank haben damit ein Problem.

  • Hier jetzt noch einmal der Code an sich. Mit diesem klappt jetzt die Eingabe!

    Ich übergebe ja meine Ausgaben mit einem Platzhalter "?". Ich schaffe den Primary Key aber irgendwie nicht sich von selbst zu erweitern.
    Wenn ich mit den 3 Fragezeichen arbeite (nicht Titus und Co ;) ), kommt die Fehlermeldung die Datenbank besteht aus 4 Werten.
    Mit ?, ?, ?, ? kommt die Fehlermeldung meine Nummer wäre nicht angegeben und das Programm steigt wieder aus.
    Im Netz finde ich leider nichts über die richtige Funktion als Platzhalter. Alternativ könnte man die Sekunden als Primary Key ja verwenden, aber das wäre nicht Sinn um den Fehler zu umgehen.

    Auch die Ausgabe macht jetzt noch Probleme. Nur wenn ich die Daten in CSV ausgebe und dann in Excel öffne, bekomme ich die richtige Darstellung wieder raus mit Zeilenschaltung.

    Aktuell bin ich deshalb auf der Suche im Netz, wie ich die CSV Ausgabe auch in die Bash stelle.

    @__deets__ Ich hatte es schon in PHP versucht umzusetzen, bin daran aber gescheitert. Daher wollte ich es über Python erst einmal testen. Hier hatte ich ein paar Infos bzw. Codeschnippsel die ich mit verwenden konnte. Wenn es in der Shell läuft reicht schon.
    Die Möglichkeit der Webseite ist gedacht um auch so einmal ohne Putty und Co die Daten verarbeiten zu können.

    Wenn ich mich dann an die PHP Umsetzung mache, wird man sicherlich von mir im Forum lesen ;-).

    Danke an alle die geholfen haben!

  • Bitte poste den *konkreten* Fehler fuer obigen Code, nicht eine Paraphrasierung von dir, und auch nicht einen Fehler fuer irgendwelchen anderen Code (also zB die Variante mit drei ?, die wir hier nicht zur Verfuegung haben).

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!