Hallo,
erstelle aktuell einen Telegram Bot, welchen man Fotos sendet, mit Angabe, in welcher Ordnerstruktur die Fotos abgelegt werden sollen und eine Notiz für die Fotos.
Sind diese Informationen nicht enthalten, werden die Fotos in einer Zwischendatenbank abgelegt.
Führt man den entsprechenden Telegram Befehl aus, dass die undefinierten Fotos verarbeitet werden, so soll der Bot die Fotos als markierte Antwort wieder vorlegen und auf die Informationen warten. Bekommt er die Informationen soll das nächste Foto verarbeitet werden, solange bis in der Zwischendatenbank keine Fotos mehr zwischen gespeichert sind.
Da ich bei Telegram ja wieder auf Antworten warten muss etc. so funktioniert keine einfache for-Schleife über alle abgelegten Fotos. Deshalb hole ich nur einen Datensatz ab, und rufe am Ende die Funktion wieder rekrusiv auf:
def undefinierte_fotos_verarbeiten(self, message):
if self.umenue is None:
undefiniertes_foto = db.FotoUndefiniert.get()
if len(undefiniertes_foto) > 0:
self.menue = self.undefinierte_fotos_verarbeiten
else:
self.menue = None
self.umenue = None
return # Es sind keine weiteren undefinierten Fotos vorhanden
self.send_message(chat_id=undefiniertes_foto.chat_id,
text="Ordner und Notiz angeben",
reply_to_message_id=undefiniertes_foto.message_id)
self.undefinierte_file_id = undefiniertes_foto.file_id
self.undefinierte_message_id = undefiniertes_foto.message_id
self.umenue = 1
elif self.umenue == 1:
ordner, notiz = caption_analysieren(message["message"]["text"])
ordner_db_id = db.ordner_struktur_erstellen(ordner)
verzeichnis = verzeichnis_erstellen(ordner)
file_id = db.FotoUndefiniert.select(db.FotoUndefiniert.file_id).where(
db.FotoUndefiniert.message_id == self.undefinierte_message_id).scalar()
file, file_path = self.get_file(file_id)
dateiendung = get_dateiendung(file_path)
file_name = db.file_speichern(ordner_db_id, notiz, dateiendung)
datei_speichern(verzeichnis, file_name, file)
db.FotoUndefiniert.delete().where(db.FotoUndefiniert.message_id == self.undefinierte_message_id).execute()
self.umenue = None
self.undefinierte_fotos_verarbeiten("")
Display More
Am besten hätte mir folgender Weg gefallen um das zu realsieren:
def undefinierte_fotos_verarbeiten(self, message):
if self.umenue is None:
undefiniertes_foto = db.FotoUndefiniert.get()
if len(undefiniertes_foto) > 0:
self.menue = self.undefinierte_fotos_verarbeiten
else:
self.menue = None
self.umenue = None
return # Es sind keine weiteren undefinierten Fotos vorhanden
self.send_message(chat_id=undefiniertes_foto.chat_id,
text="Ordner und Notiz angeben",
reply_to_message_id=undefiniertes_foto.message_id)
self.undefinierte_file_id = undefiniertes_foto.file_id
self.undefinierte_message_id = undefiniertes_foto.message_id
self.umenue = 1
Display More
len() gibt es aber bei .get() nicht
Traceback (most recent call last):
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 52, in undefinierte_fotos_verarbeiten
if len(undefiniertes_foto) > 0:
TypeError: object of type 'FotoUndefiniert' has no len()
Das hatte ich aber so und so bei dieser Variante nur eingebaut, weil wenn kein Datensatz mehr in der Datenbank vorhanden ist, es zu folgendem Fehler kommt:
Traceback (most recent call last):
...
IndexError: list index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 178, in <module>
main()
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 164, in main
bot.undefinierte_fotos_verarbeiten("")
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 51, in undefinierte_fotos_verarbeiten
undefiniertes_foto = db.FotoUndefiniert.get()
File "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\peewee.py", line 5644, in get
return sq.get()
File "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\peewee.py", line 6047, in get
(clone.model, sql, params))
db_modell.FotoUndefiniertDoesNotExist: <Model: FotoUndefiniert> instance matching query does not exist:
SQL: SELECT "t1"."message_id", "t1"."chat_id", "t1"."file_id" FROM "fotoundefiniert" AS "t1" LIMIT ? OFFSET ?
Params: [1, 0]
Display More
Die oben gezeigte Struktur würde dann beim rekrusiv aufruf etwas anders ausseden, sonst wär eine Endlosschleife gebaut, aber das betrifft das Problem nicht...
Wie ließe sich der auftretende Fehler db_modell.FotoUndefiniertDoesNotExist: denn gezielt mit try/except abfangen.
das db_modell.FotoUndefiniert kommt wohl über mich zustanden
-> db_modell = Dateiname
-> FotoUndefiniert = Klassenname
Da ich da keine Lösung gefunden habe, wechselte ich von get zu select
def undefinierte_fotos_verarbeiten(self, message):
if self.umenue is None:
undefiniertes_foto = db.FotoUndefiniert.select().limit(1).execute()
if len(undefiniertes_foto) > 0:
self.menue = self.undefinierte_fotos_verarbeiten
else:
self.menue = None
self.umenue = None
return # Es sind keine weiteren undefinierten Fotos vorhanden
self.send_message(chat_id=undefiniertes_foto.chat_id,
text="Ordner und Notiz angeben",
reply_to_message_id=undefiniertes_foto.message_id)
self.undefinierte_file_id = undefiniertes_foto.file_id
self.undefinierte_message_id = undefiniertes_foto.message_id
self.umenue = 1
elif self.umenue == 1:
Display More
Daher kommt auch das len(), denn wenn die Abfrage keine Datensätze enthält funktioniert alles.
Wenn es aber Datensätze enthält, kommt es zu Problemen bei der Verarbeitung, dort wo es mit get() keine Probleme gegeben hat:
Traceback (most recent call last):
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 178, in <module>
main()
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 164, in main
bot.undefinierte_fotos_verarbeiten("")
File "G:/Projekte/github/foto_ablage_telegrambot/fotoablage_bot.py", line 59, in undefinierte_fotos_verarbeiten
self.send_message(chat_id=undefiniertes_foto.chat_id,
AttributeError: 'ModelObjectCursorWrapper' object has no attribute 'chat_id'
Process finished with exit code 1
Auch wenn ich das execute() weg lasse in der Abfrage ist es der selbe Fehler.
Jemand eine Idee?