@Ruffy: Ich würde dann erst einmal auf
PEP 8 -- Style Guide for Python Code verweisen was die Namensgebung und das Einrücken betrifft.
Dann wurde ja schon gesagt, dass das zu viele Anfragen sind. Setz Dich mal mit SQL auseinander. Man kann mit einer Anfrage Daten aus mehr als einer Tabelle abfragen und miteinander verknüpfen. Das Stichwort ``JOIN`` wurde ja schon genannt.
Es ist sehr deutlich viel Copy & Paste „Programmierung” erkennbar. Du solltest mal bewusst auf die entsprechende Editor-Funktion verzichten und den Quelltext tatsächlich *schreiben*. Dann denkst Du sicher mehr darüber nach was Du tust und wie man das ständige Wiederholen von Mustern vermeiden kann. Viele der `Book._get*()`-Methoden sind *sehr* ähnlich aufgebaut. Das gleiche gilt für die `list*()`-Methoden. Nebenbei sind das alles keine Methoden — `Book` ist keine Klasse, sondern fasst einfach nur einen Haufen Funktionen zusammen. Das ist aber die Aufgabe von Modulen.
Durch das Sternchen nach dem ``SELECT`` werden viel mehr Daten abgefragt als in den meisten der `_get*()`-Methoden dann auch tatsächlich verarbeitet werden.
In `searchTitle()` wird `_generateBook()` mit der falschen Anzahl von Argumenten aufgerufen. Ausserdem wird dort und in `searchRating` auf `myDB` zugegriffen ohne dass der Name vorher an einen Wert gebunden wird.
Die `_init_()`-Methode ist sinnfrei und der Name falsch geschrieben.
Von den fünf Importen im `calibre.books`-Modul wird nur *einer* tatsächlich verwendet.
Im `db`-Modul gibt es einiges was da wohl auch durch kopieren von einem anderen Projekt hingekommen ist, was man aber nicht braucht.
`dict_factory()` existiert zweimal. Die „Methode” sollte verschwinden und bei `DBConnection.__init__()` sollte man bei `row_type` direct die Funktion übergeben statt den Umweg über eine Zeichenkette und einem ``if`` zu gehen.
Aber eigentlich sollte das alles SQLAlchemy weichen.