Insert Intro + Abfrage Problem

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

Ich habe direkt mal 2 Fragen an euch:
1. Ich möchte gerne etwas in meine MySQL Datenbank einfügen. Ich benutze folgenden Code:

Code: Alles auswählen

cursor.execute("""INSERT INTO test_chat (text) VALUES (eingabe.get())""") 
Jetzt kommt immer die Fehlermeldung, dass die Funktion eingabe.get() nicht exestiert. Wenn ich die Funktion aber nicht in einem "Insert Into" benutze, dann geht das einwandfrei.

2. Ich habe eine MySQL Abfrage in meinem Code. Diese wird aber leider nur einmal ausgeführt. Ich möchte die halt gerne so machen, dass die Datenbank immer wieder abgefragt wird, so dass, sobald etwas neues in die Datenbank eingefügt wird, dass dann sofort wieder mit abgefragt wird weil atm. muss ich dafür immer noch mal das ganze Programm neustarten.

Wäre euch für jede Hilfe dankbar!
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tmfdsm hat geschrieben:

Code: Alles auswählen

cursor.execute("""INSERT INTO test_chat (text) VALUES (eingabe.get())""") 
Jetzt kommt immer die Fehlermeldung, dass die Funktion eingabe.get() nicht exestiert.
Es wäre schön, wenn du die exakte Fehlermeldung angäbest, da gezeigter Code und Beschreibung des Fehlers nicht zusammenpassen. Was du mit dem Code da versuchst ist, den Rückgabewert von eingabe(get) in die Datenbank zu schreiben. Was du aber fälschlicherweise tust ist den Text "eingabe.get()" in die Datenbank zu schreiben. Die Funktion eingabe.get() wird hier nicht aufgerufen und kann daher auch nicht die von dir genannte Fehlermeldung hervorrufen.
tmfdsm hat geschrieben:2. Ich habe eine MySQL Abfrage in meinem Code. Diese wird aber leider nur einmal ausgeführt. Ich möchte die halt gerne so machen, dass die Datenbank immer wieder abgefragt wird, so dass, sobald etwas neues in die Datenbank eingefügt wird, dass dann sofort wieder mit abgefragt wird weil atm. muss ich dafür immer noch mal das ganze Programm neustarten.
Diese Beschreibung ist viel zu ungenau um damit etwas anfangen zu können. Es klingt allerdings so, als hättest du keine Schwierigkeiten mit der Datenbank sondern mit den Grundlagen von Python (oder des Softwaredesigns) an sich.
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

Also, um das ganze hier jetzt mal zeigen zu können, ist hier mal mein Code (ich weiß, dass der sehr durcheinander programmiert ist!):

Code: Alles auswählen

import MySQLdb

root = Tk()
root.title('Chatten mit Python')

textfenster = Text(root,width=90)
textfenster.pack(fill=BOTH,expand=YES)

eingabe = Entry(root,width=60)
eingabe.pack(side=LEFT,fill=BOTH,expand=YES)

def info():
    textfenster.insert(END,'\nVersion 0.5' + eingabe.get())

def senden():

    cursor = mysql.cursor()
    cursor.execute("""INSERT INTO test_chat (text) VALUES (eingabe.get())""") 

def ende():
    root.destroy()



but1 = Button(root,text='Senden', command = senden)
but1.pack(side = LEFT,expand=NO)

but3 = Button(root,text='Info', command = info)
but3.pack(side = LEFT,expand=NO)

but4 = Button(root,text='Beenden', command = ende)
but4.pack(side = LEFT,expand=NO)


verbindung = 1

if verbindung == 1:
    
    mysql_opts = {
         'host': "tmfdsm.incredispace.eu",
         'user': "tmfdsm",
          'pass': "passwort",
          'db':   "tmfdsm"
        }
    mysql = MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db'])

    mysql.apilevel = "2.0"
    mysql.threadsafety = 2
    mysql.paramstyle = "format"

    if verbindung == 1:
      cursor = mysql.cursor()
      cursor.execute("SELECT text FROM `test_chat`")
      products = cursor.fetchall()
      textfenster.insert(END, products)




root.mainloop()
Ich habe jetzt das Zeil, einen kleinen Chat per MySQL zu bauen. Also erstmal zur Frage 1:
Hier ist die genaue Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Python26\test", line 21, in senden
    cursor.execute("""INSERT INTO test_chat (text) VALUES (eingabe.get())""")
  File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (1305, 'FUNCTION eingabe.get does not exist')
Jetzt zu Frage 2:
Ich habe ja diese Zeilen:

Code: Alles auswählen

if verbindung == 1:
      cursor = mysql.cursor()
      cursor.execute("SELECT text FROM `test_chat`")
      products = cursor.fetchall()
      textfenster.insert(END, products)
Diese sollen jetzt JEDES MAL durchlaufen werden. Also müsste ja theoretisch bei jedem durchlauf des Programms der Text wieder aktualisiert werden müssen. Wenn ich das Programm allerdings laufen lasse und derweil Manuell etwas in die Datenbank eintrage, dass erscheint das nicht direkt in dem Textfenster.[/quote]
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tmfdsm hat geschrieben:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Python26\test", line 21, in senden
    cursor.execute("""INSERT INTO test_chat (text) VALUES (eingabe.get())""")
  File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (1305, 'FUNCTION eingabe.get does not exist')
Für mich sieht das eindeutig so aus, als käme der OperationalError von der Datenbank die verzweifelt versucht eingabe.get() auf Datenbankebene zu interpretieren.

Lies bitte meinen ersten Beitrag zu deinem Problem noch mal und mach dir klar, was du da eigentlich an die Datenbank schickst.
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

also ich möchte gerne den Inhalt von eingabe.get() in die Datenbank schreiben. Wie mach ich das jetzt?
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tmfdsm hat geschrieben:also ich möchte gerne den Inhalt von eingabe.get() in die Datenbank schreiben. Wie mach ich das jetzt?
Du benötigst den Rückgabewert und den solltest du dann als Parameter in die Query geben.

Die MySQLdb-Anleitung und PEP 249 erklären das so schön, dass es gar keinen Sinn für mich macht das hier zu wiederholen.
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

kannst du mir nicht bitte einfach sagen, wie der Insert Intro Befehl richtig heißen muss? Denn damit: "Du benötigst den Rückgabewert und den solltest du dann als Parameter in die Query geben." kann ich leider NICHTS anfangen!
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

/me hat geschrieben:... Die MySQLdb-Anleitung und PEP 249 erklären das so schön, dass es gar keinen Sinn für mich macht das hier zu wiederholen....
Hast Du Dir denn inzwischen das mal durchgelesen? Oder müssen die Jungs und Mädels hier Dir alles vorkauen?

€dit: achja ... "Bettler und Hausierer werden erschossen"

>>Masaru<<
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

ich verstehe das nicht. Und ist es denn so schwer, wenn ihr mir einfach sagt, wie es richtig lauten muss? Die schreiben da alle was mit %s, aber bei mir gibt dass dann sofort nen Error ...

EDIT: ok, frage 1 ist beantwortet, habe die Lösung über google finden können. Aber was ist jetzt mit Frage 2?
Zuletzt geändert von tmfdsm am Dienstag 16. Februar 2010, 12:58, insgesamt 1-mal geändert.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... und welchen Error?

Weisst Du, wir verbringen hier manchmal ja echt so das eine oder andere Unvorstellbare ... aber für Wunder brauchen selbst wir einfach ein bisschen mehr Informationen.
Zuletzt geändert von Masaru am Dienstag 16. Februar 2010, 13:00, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tmfdsm hat geschrieben:kannst du mir nicht bitte einfach sagen, wie der Insert Intro Befehl richtig heißen muss?
Ja, das könnte ich. Ich werde es aber nicht tun.

Der Effekt wäre nämlich, dass du einfach nicht anfängst Python zu lernen sondern dir für jedes Problem irgendwelche Codeschnipsel zusammenstoppelst und bei Nichtfunktionieren immer direkt fragst und dann Sachen einbaust die du nicht verstehst. Das hilft dir nichts wenn du Python lernen willst. Wenn du es nicht lernen willst sondern einfach nur das Programm lauffähig haben möchtest, dann lässt sich das auch einrichten, allerdings zählt das dann nicht mehr als freiwillige Hilfestellung im Forum aus Freude an der Sache sondern als stundenweise abgerechneter Auftrag. Wenn ich als Antwortender das Gefühl bekomme, dass ich hier nur als unentgeltliche Sourcecodeproduktionsmaschine gebraucht werde, dann nimmt mir das die Motivation.

Vielleicht mag jemand anders die Lösung hinschreiben, für mich ist die Frage erst einmal erledigt.
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

ne, das ist jetzt ha nicht mehr nötig, da sich ja alles geklärt hat. Zu meinem 2. problem habe ich aber keine Ahnung. Kann mir da jetzt noch pls jemand weiterhelfen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was genau war jetzt das 2. Problem?
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

Wenn man Codeabschnitte mehrfach durchlaufen will, bieten sich Schleifenkonstruktionen an. Welche der verschiedenen Möglichkeiten zu wählen ist, überlasse ich dem geneigten Frager zur Übung. Siehe Grundlagendebatte...

CU Uwe
---------------------------------
have a lot of fun!
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

Ich weiß, dass ich eine Schleife brauche. Mein Problem ist allerdings, dass ich nicht weiß, welche ich brauche, denn:
Würde eine z.B. eine while nehmen, dann würde er halt 5 mal hintereinander die selbe abfrage machen. Ich möchte aber, dass das Programm von sich aus z.B. alle 2 Sekunden diese Abfrage wiederholt, der Rest vom Programm soll aber trotzdem ausgeführt werden. Ich bräuchte dann halt sowas wie z.B. bei Tkinter fenster.mainloop(), nur halt für das MySQL Zeugs.
Gibt es solch eine Schleife bzw. eine andere Methode?

Und damit ihr auch noch mal richtig mein Problem versteht:
Ich habe einen Chat und habe eine MySQL Abfrage drin. Beim Start wird diese jetzt einmal ausgeführt, sodass der Text angezeigt wird. Wenn jetzt allerdings der gegenüber etwas schreibt, wird das ja nich direkt eingetragen. Deshalb muss ich momentan immer auf den Button "Refresh" drücken, aber wenn man dann halt mal nen bischen länger chatten will, ist es doof, wenn man dann alle 2 sek. auf den Button drücken muss. Deshalb will ich machen, dass das Programm von sich aus alle 2 Sekunden einen Refresh durchführt. Wenn ich aber ne while nehme, dann wird ja erst die while ausgeführt, dann wird der Code weiter ausgeführt. Ich bräuchte halt z.B. sowas wie einen "parallelen Prozess", bei dem durchgehend der Text aktualisiert wird.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tmfdsm hat geschrieben:Ich weiß, dass ich eine Schleife brauche. Mein Problem ist allerdings, dass ich nicht weiß, welche ich brauche, denn:
Würde eine z.B. eine while nehmen, dann würde er halt 5 mal hintereinander die selbe abfrage machen. Ich möchte aber, dass das Programm von sich aus z.B. alle 2 Sekunden diese Abfrage wiederholt, der Rest vom Programm soll aber trotzdem ausgeführt werden. Ich bräuchte dann halt sowas wie z.B. bei Tkinter fenster.mainloop(), nur halt für das MySQL Zeugs.
Das klingt nach Threading.

Schau mal in diesen Thread.
tmfdsm
User
Beiträge: 34
Registriert: Donnerstag 28. Januar 2010, 19:41

hmm ... wenn ich das jetzt richtig Verstehe, sollte das so sein:

Ich habe mit "def refresh" eine Funktion, bei dessen Aufruf der Chat aktualisiert wird. Dann mach in an den Anfang vom Code "import thread" und mache dann ganz an Schluss, direkt vor root.mainloop(), "thread.start_new(refresh)".

Wenn ich das eingebe, kommt folgende Fehlermeldung:

Code: Alles auswählen

IDLE internal error in runcode()
Traceback (most recent call last):
  File "C:\Python26\lib\idlelib\rpc.py", line 235, in asyncqueue
    self.putmessage((seq, request))
  File "C:\Python26\lib\idlelib\rpc.py", line 332, in putmessage
    n = self.sock.send(s[:BUFSIZE])
error: [Errno 10035] Ein nicht blockierender Socketvorgang konnte nicht sofort ausgeführt werden
Habe ich in dem oben genannten etwas falsch gemacht oder habe ich das ganze komplett falsch verstanden?
Antworten