Text aus MySQL in Python abfragen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    Also,
    ich möchte einen Text aus MySQL Abfragen und ihn dann in einem Python Script ausgeben.
    Leider habe ich keine Ahnung wie ich das anstellen soll.

    Hab mal meine Datenbank Exportiert


    Python Script (Auschnitte)

    Also, ich möchte den Text (Hallo) von der Spallte 1 aus der Tabelle Talk abfragen und ihn ausgeben lassen.


    EDIT:

    Python fehlermeldung:

    Code
    Traceback (most recent call last):
      File "./speechpi.py", line 34, in <module>
        if cursor.execute("SELECT `talk`.`1` FROM `talk`") in data[0].lower():
    TypeError: 'in <string>' requires string as left operand, not long

    Einmal editiert, zuletzt von ps915 (10. Mai 2015 um 23:13)

  • Ich habe mir mal erlaubt Deine kleine Tabelle bei mir zu erstellen und zu füllen (Geht ja schnell da Du alle sql Statements mitgeliefert hast). Ich erhalte dann mit


    Egal ob ich Deine ziemlich umständliche Query nehme oder die einfacher lesbare ohne die vielen Ticks funktioniert es. D.h. eigentlich ist alles syntaktisch OK. Ich würde an Deiner Stelle die execute Zeile noch mal neu einzugeben bzw die einfachere Variante von mir zu nehmen. Ich habe das Gefühl da ist irgendein ungültiges Zeichen in Deiner Query.

    Ausserdem hast Du mit Deinen Statements 1 Zeile in der Tabelle erzeugt die 6 Spalten hat. Ich glaube Du willst aber eigentlich eine Tabelle mit 1 Spalte und 6 Zeilen :shy:

    und

    Code
    mysql> select * from talk;
    +-------+--------+--------+--------+--------+--------+
    | 1     | 2      | 3      | 4      | 5      | 6      |
    +-------+--------+--------+--------+--------+--------+
    | Hallo | Hallo2 | Hallo3 | Hallo4 | Hallo5 | Hallo6 |
    +-------+--------+--------+--------+--------+--------+

  • Ich habe mir mal erlaubt Deine kleine Tabelle bei mir zu erstellen und zu füllen (Geht ja schnell da Du alle sql Statements mitgeliefert hast). Ich erhalte dann mit


    Egal ob ich Deine ziemlich umständliche Query nehme oder die einfacher lesbare ohne die vielen Ticks funktioniert es. D.h. eigentlich ist alles syntaktisch OK. Ich würde an Deiner Stelle die execute Zeile noch mal neu einzugeben bzw die einfachere Variante von mir zu nehmen. Ich habe das Gefühl da ist irgendein ungültiges Zeichen in Deiner Query.

    Ausserdem hast Du mit Deinen Statements 1 Zeile in der Tabelle erzeugt die 6 Spalten hat. Ich glaube Du willst aber eigentlich eine Tabelle mit 1 Spalte und 6 Zeilen :shy:

    und

    Code
    mysql> select * from talk;
    +-------+--------+--------+--------+--------+--------+
    | 1     | 2      | 3      | 4      | 5      | 6      |
    +-------+--------+--------+--------+--------+--------+
    | Hallo | Hallo2 | Hallo3 | Hallo4 | Hallo5 | Hallo6 |
    +-------+--------+--------+--------+--------+--------+

    Danke erstmal für deine mühe.

    Das mit den 6 Spallten ist schon gewollt, die sollten auch benutz werden. Mein Python Code oben war ja nur ein ausschnitt.

    Bekomme aber leider wieder einen Fehler.

    " IndentationError: unindent does not match any outer indentation level "
    In der Zeile: if cursor.execute("SELECT talk.1 FROM talk") in data[0].lower():

  • Zitat


    ...
    Bekomme aber leider wieder einen Fehler.

    " IndentationError: unindent does not match any outer indentation level "
    In der Zeile: if cursor.execute("SELECT talk.1 FROM talk") in data[0].lower():


    Hm ... der Indentationfehler - wo kommt der her? Aus Deinem Code oder aus dem mysqldb?

    BTW: Du brauchst nicht mein ganzes Posting zu zitieren in Deiner Antwort. Macht sie sehr unübersichtlich ;)

  • Der kommt aus dem Code.

    Hier mal eben der ganze

    Auch Vielleicht Hilfreich:
    Das ganze ist eine Sprachsteuerung, die befehle gebe ich über mein Handy.

  • So wird das leider nicht funktionieren...hab leider kein Python zur hand . du musst aber auf alle Fälle erst mal die queryausgabe fetchen


  • So wird das leider nicht funktionieren...hab leider kein Python zur hand . du musst aber auf alle Fälle erst mal die queryausgabe fetchen

    Ahh Oke,
    Leider hab ich Kein Plan wo ich das alles hinsetzen muss.

  • Zitat


    if cursor.execute("SELECT talk.1 FROM talk") in data[0].lower():

    Das sieht aber schon anders aus als Deine Codefragmente im initialen Post :-/ . Das geht natürlich nicht. Du musst Dir erst die Daten per fetch holen und kannst dann erst auf ihnen arbeiten.

  • So hab einen cursor.fetchall() am Ende vor der Print Zeile gesetzt.
    Bekomme jetzt jedoch Error:


    Code
    Traceback (most recent call last):
      File "./speechpi.py", line 36, in <module>
        if cursor.execute("SELECT talk.1 FROM talk") in data[0].lower():
    TypeError: 'in <string>' requires string as left operand, not long

    Sry, wenn ich mich etwas doof damit anstelle.
    Bin noch am Python lernen..

    Gruß

    Einmal editiert, zuletzt von ps915 (10. Mai 2015 um 23:14)

  • So hab einen cursor.fetchall() am Ende vor der Print Zeile gesetzt.
    Bekomme jetzt jedoch Error:

    Code
    Traceback (most recent call last):
      File "./speechpi.py", line 36, in <module>
        if cursor.execute("SELECT talk.1 FROM talk") in data[0].lower():
    TypeError: 'in <string>' requires string as left operand, not long

    Sry, wenn ich mich etwas doof damit anstelle.
    Bin noch am Python lernen..

    Gruß

    EDIT:
    Wenn ich den fetchall vor die if Zeile Setze kommt das:

    Code
    Traceback (most recent call last):
      File "./speechpi.py", line 34, in <module>
        cursor.fetchall()
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 344, in fetchall
        self._check_executed()
      File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 80, in _check_executed
        self.errorhandler(self, ProgrammingError, "execute() first")
      File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
    _mysql_exceptions.ProgrammingError: execute() first

    Also Zuerst Execute machen, deswegen hab ich das ans ende gesetzt.

    Einmal editiert, zuletzt von ps915 (10. Mai 2015 um 23:14)

    • Offizieller Beitrag

    Poste mal bitte deinen kompletten code.

    Wenn du weisst das das du einen Wert zurück kriegst kannst du die fetchone() Methode nehmen, diese Liefert ein tupel zurück.

    Code
    result =cursor.fetchone()

    Nur musst kommt es auf dein query an. aber mir mit result[0], result[1] usw., würdest jetzt die entsprechenden Stellen (Spalten) ansprechen.

    Bei mehreren Werten au der DB kannst du mit:

    Code
    rows = cursor.fetchall()
    for ergebnis in rows:
       print ergebnis


    alle Treffer anzeigen lassen. Auch hier wird afaik ein tuple zurückgegeben.

  • Ist etwas umgeschrieben als die von oben.

    Ich verstehe das mit dem fetchen nicht ganz richtig.
    Wo muss ich das den hinsetzen & was muss ich
    [font="Monaco"]if #HIER#EINSETZEN# in data[0].lower():[/font]
    [font="Monaco"]dass er den Text aus MySql "übernimmt"?[/font]

    Python:

    SQL:

    • Offizieller Beitrag

    Genau da kommt der Schlips ins Rad, denn imho macht dein Aufbau keinen Sinn :)
    Ich geh davon aus das du eine Datenbank mit fragen und möglichen Antworten aufbauen willst, richtig?

    Ich würde zuerst schauen was gefragt wurde, aufgrund diesen Wertes (data[0].lower()) eine Abfrage an die Datenbank stellen und mir die möglichen Antworten daraus holen. Dein derzeitiges spaltenlayout würde ich überdenken, pro befehl eine zeile bzw. ein eintrag macht viel mehr sinn (so kannst du pro befehl x mögliche antworten, optionen, usw verknüpfen). Bei einem zeilenweisen aufbau würdest du dir auch die 8 if's sparen sondern würdest mit einem Auskommen, ungefähr so:

    Code
    #---> Smaltalk <---#
    cursor.execute("Select Antwort FROM TALK WHERE Frage LIKE %s" % (data[0].lower()))
    result = cursor.fetchone()
    If len(result) >0:
      komm.send(result[0])
    else:
      komm.send("Ich habe dich nicht verstanden")

    Nur weil irgendwo mal die "if blabla in data[0]" syntax aufgetaucht ist, heisst das nicht, dass man sich immer daran halten muss ;). Sie ist bei direkten Stringvergleichen simpel und effektiv. Am ende wirst du nicht um RegExp rumkommen ;). Ich habe auch mal mit 1:1 vergleichen bei Wörtern angefangen, man wird ab ner bestimmten Satz(befehls)komplexität wird man wahnsinning. ;)

    Edit die 3.

    Benutzt nicht mehr os.popen sondern stattdessen subprocess

    Weitere Anmerkung:

    Code
    if cursor.execute("SELECT cmd.2 FROM cmd") in data[0].lower():
                    handle = os.popen("sudo service motion start")
                    line = handle.read()
                    handle.close()
                    line = "Ich habe die Kamera fuer dich aktiviert. Der Stream ist nun erreichbar"
                    komm.send(line)

    Warum liest du handle aus, wenn du mit dem Rückgabewert nix anstellst sondern ihn gleich mit einem "String" überschreibst?

  • Erstmal einen großen Dank an dich, dass du dir die mühe zum schreiben gemacht hast ;p. Die letzte Frage kann ich dir schonmal beantworten, Ich bin Anfänger und ich übernehme das einfach Stumpf. Ich probiers morgen mal alles aus jetzt bisschen Spät dafür :D


  • Ich geh davon aus das du eine Datenbank mit fragen und möglichen Antworten aufbauen willst, richtig?


    -Genau

    Zitat


    Ich würde zuerst schauen was gefragt wurde, aufgrund diesen Wertes (data[0].lower()) eine Abfrage an die Datenbank stellen und mir die möglichen Antworten daraus holen. Dein derzeitiges spaltenlayout würde ich überdenken, pro befehl eine zeile bzw. ein eintrag macht viel mehr sinn.


    -Wie soll ich das denn aufbauen? Was muss Frage und Was Muss Antwort heißen, wo müssen die Texte hin?

    Zitat


    Nur weil irgendwo mal die "if blabla in data[0]" syntax aufgetaucht ist, heisst das nicht, dass man sich immer daran halten muss ;). Sie ist bei direkten Stringvergleichen simpel und effektiv. Am ende wirst du nicht um RegExp rumkommen ;). Ich habe auch mal mit 1:1 vergleichen bei Wörtern angefangen, man wird ab ner bestimmten Satz(befehls)komplexität wird man wahnsinning. ;)


    -Das werde ich mir jetzt merken, doch nicht alles soo einfach wie ich dachte :D :P

    Zitat


    Warum liest du handle aus, wenn du mit dem Rückgabewert nix anstellst sondern ihn gleich mit einem "String" überschreibst?


    -Keine Ahnung. Ich dachte das muss so. :D


    Sry wegen meinen neuen Fragen usw..


  • Evtl kann ich dir ja heute auch mal ein Beispiel schreiben.

    So eines findet sich schon beim Link im Beitrag #10 wie auch wenn man googelt. Zu fetch, fetchone und fetchall findet sich auch Beispielcode hier. Der Vorteil ist, da es nicht nur Code enthaelt sondern auch Beschreibungen, weshalb und warum. Dann ist der Lerneffekt viel groesser fuer den TE.

    Willst Du (1) nur Dein Programm zum Laufen bringen oder (2) auch auch verstehen wie man so was schreibt? Bei Antwort (1) hilft Dir sicherlich wenn Alex Dein Proramm umbaut und korrigiert. Bei (2) solltest Du im Netz googeln und/oder Dir Buecher zu Python und mysqldb besorgen und lesen. Wenn Du dann Fragen hast kannst Du diese hier ja stellen und wirst Antworten bekommen. Wenn man was selbst schreibt ist der Lernerfolg wesentlich groesser als wenn man nur was abtippt.

  • Danke für die Seite! Ich will natürlich 1. & 2.. Um dass mir das jemand schreibt, hab ich ja eigentlich nicht gebeten, eher darum dass, mir das genauer erklärt wird. Das mit den Büchern werd ich wahrscheinlich auch machen, Danke! Ich melde mich nacher nochmal, bin gerade nur vom Handy.

    • Offizieller Beitrag

    Ich bin auch kein Freund davon, anderen die Programme zu schreiben. Helfen bei Fehlern, Verständnis, Verbesserungen usw. kein Problem. Sobald man darüber hinaus geht scheitert der TE (im Allgemeinen ;) ) dann meistens schon an simpelsten Änderungen weil er den Code nicht versteht.


    Fang mit der Datenbank an.
    Spalten:
    ID, Frage, Antwort1,Antwort2, wasauchimmerdunochbrauchst

    Mit diesem Aufbau macht mein Beispiel von oben hoffentlich Sinn

Jetzt mitmachen!

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