Abfrage SQlite Datenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: dass man statt copy-paste besser eine Schleife benutzt, hab ich Dir ja schon gesagt. JSON sollte man auch nit per String-Formatierung erzeugen. Du solltest Deine Variablennamenschreibweise an die Konvention anpassen, was ist denn WINDOW und wie wird das gefüllt?
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

bis jezuz habe ich davon noch gar nichts benutz...
das was dort als Code steht, kommt aus einem anderen Plugin, nicht von mir... Das macht halt genau das
was ich möchte...
Die Ganze JSON Geschichte benörige ich in dem Fall gar nicht, da mein Abglaich mit der Datenbankt anders erfolgen soll...
Sirius3 hat geschrieben:was ist denn WINDOW und wie wird das gefüllt?
WINDOW.setProperty... setzt ja die jeweiligen Items die dann im jeweiligen Skin in KODI aufgerufen werden...
WINDOW.getProperty holt die gesetzten Propertys aus einem Plugin... in meinem werden die Propertya ja hier
befüllt:

Code: Alles auswählen

WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
normaler Weise werden die Properties innerhalb eines Skins dann als Kontent abgerufen...

Code: Alles auswählen

	<include name="SerienPlanerContent">
		<item>
			<property name="channel">$INFO[Window.Property(SerienPlaner.0.Channel)]</property>
			<property name="poster">$INFO[Window.Property(SerienPlaner.0.Poster)]</property>
			<property name="plot">$INFO[Window.Property(Serienplaner.0.Description)]</property>
			<property name="staffel">$INFO[Window.Property(SerienPlaner.0.Staffel)]</property>
			<property name="episode">$INFO[Window.Property(SerienPlaner.0.Episode)]</property>
			<property name="starttime">$INFO[Window.Property(SerienPlaner.0.Starttime)]</property>
			<property name="rating">$INFO[Window.Property(SerienPlaner.0.Rating)]</property>
			<property name="senderlogo">$INFO[Window.Property(SerienPlaner.0.Logo)]</property>
			<property name="genre">$INFO[Window.Property(SerienPlaner.0.Genre)]</property>
			<property name="date">$INFO[Window.Property(SerienPlaner.0.Datum)]</property>
			<property name="runtime">$INFO[Window.Property(SerienPlaner.0.RunningTime)]</property>
			<property name="studio">$INFO[Window.Property(SerienPlaner.0.Studio)]</property>
			<property name="year">$INFO[Window.Property(SerienPlaner.0.Jahr)]</property>
			<property name="altersfreigabe">$INFO[Window.Property(SerienPlaner.0.Altersfreigabe)]</property>
			<property name="status">$INFO[Window.Property(SerienPlaner.0.Status)]</property>
			<label>$INFO[Window.Property(SerienPlaner.0.Title)]</label>
			<label2>$INFO[Window.Property(SerienPlaner.0.TVShow)]</label2>
			<thumb>$INFO[Window.Property(SerienPlaner.0.Thumb)]</thumb>
			<icon>$INFO[Window.Property(SerienPlaner.0.Poster)]</icon>	
			<visible>!IsEmpty(Window.Property(SerienPlaner.0.TVShow))</visible>
		</item>
		<item>
			<property name="channel">$INFO[Window.Property(SerienPlaner.1.Channel)]</property>
			<property name="poster">$INFO[Window.Property(SerienPlaner.1.Poster)]</property>
			<property name="plot">$INFO[Window.Property(Serienplaner.1.Description)]</property>
			<property name="staffel">$INFO[Window.Property(SerienPlaner.1.Staffel)]</property>
			<property name="episode">$INFO[Window.Property(SerienPlaner.1.Episode)]</property>
			<property name="starttime">$INFO[Window.Property(SerienPlaner.1.Starttime)]</property>
			<property name="rating">$INFO[Window.Property(SerienPlaner.1.Rating)]</property>
			<property name="senderlogo">$INFO[Window.Property(SerienPlaner.1.Logo)]</property>
			<property name="genre">$INFO[Window.Property(SerienPlaner.1.Genre)]</property>
			<property name="date">$INFO[Window.Property(SerienPlaner.1.Datum)]</property>
			<property name="runtime">$INFO[Window.Property(SerienPlaner.1.RunningTime)]</property>
			<property name="studio">$INFO[Window.Property(SerienPlaner.1.Studio)]</property>
			<property name="year">$INFO[Window.Property(SerienPlaner.1.Jahr)]</property>
			<property name="altersfreigabe">$INFO[Window.Property(SerienPlaner.1.Altersfreigabe)]</property>
			<property name="status">$INFO[Window.Property(SerienPlaner.1.Status)]</property>
			<label>$INFO[Window.Property(SerienPlaner.1.Title)]</label>
			<label2>$INFO[Window.Property(SerienPlaner.1.TVShow)]</label2>
			<thumb>$INFO[Window.Property(SerienPlaner.1.Thumb)]</thumb>
			<icon>$INFO[Window.Property(SerienPlaner.1.Poster)]</icon>		
			<visible>!IsEmpty(Window.Property(SerienPlaner.1.TVShow))</visible>
		</item>
</include>
ich nöchte das ganze nun etwas vereinfachen und ohne diese Items innerhalb des Inculdes auskommen in dem ich den Inhat über einen Programmaufruf abfrage...

Ich hoffe das war jetzt etwas verständlicher...
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Ich möchte noch einmal eure Hilfe beanspruchen,

die Propertys werden Dank eurer Hilfe perfekt gesetzt.

zusätzlich möchte ich nun auch noch folgenden return haben

Code: Alles auswählen

    query = query % (','.join(properties), filter)
    cur.execute(query, parameters)
    for idx, data in enumerate(cur, offset):
        for field, item in zip(properties, data):     
            
            WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
            

            for ... in ...
                listitems_str = {field : item}           
                listitems.append(listitems_str)
                
            return listitems
allerdings soll dieser einzeln für jedes Ergebis ausgegeben werden... ich dachte das ganze müsste so aussehen

Code: Alles auswählen

for (idx, field) in ...
allerdings weiß ich nicht in was....
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: es gibt nur ein return pro Funktion. Was meinst Du mit "einzeln"? Was soll das for ... in ... bezwecken? listitems_str ist kein String, außerdem sollte sowieso kein Typ in einem Variablennamen stehen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

also...

so wie es jetzt ist bekomme ich ein Ergebnis aus der SQL-Abfrage und zwar 15 Datensätze die dann in das Property geschrieben werden...

nun möchte ich zusätzlich jeden Datensatz einzeln haben... und zwar für idx0, idx1, idx2 usw...

das in dem Ergebnis aus der SQL-Abfrage ja die Datensätze den idx zugeordnet sind, dachte ich man kann das Ergebnis noch in einem loop weiterverarbeiten....

wenn ich den "listitems.append(listitems_str)" debugge sieht das Ergebnis so aus:

Code: Alles auswählen

listitem_str [{'TVShow': u'Private Practice'},
          	{'Staffel': u'3'}, 
          	{'Episode': u'11'}, 
          	{'Title': u'Noch eine zweite Chance'}, 
          	{'Starttime': u'11:25'}, 
          	{'Datum': u'12.04.2016'}, 
          	{'neueEpisode': u''}, 
          	{'Channel': u'SIXX HD'}, 
          	{'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5csixx%20hd.png/'}, 
          	{'PVRID': u'38'}, 
          	{'Description': u'Addison und ihr Exkollege Doktor Mark Sloan, dessen schwangere Tochter sie in Los Angeles operieren soll, finden angesichts beidseitig schwieriger Lebenssituationen Trost beieinander. Damit sorgen sie f\xfcr Aufregung in der Praxis und handeln sie sich neue Probleme ein. Cooper zeigt sich von seiner unerbittlichen Seite, sowohl gegen\xfcber seiner Freundin Charlotte wie auch einer kranken Mutter gegen\xfcber, der er das Sorgerecht f\xfcr ihren Sohn entziehen will.'}, 
          	{'Rating': u'7.2'}, 
          	{'Altersfreigabe': u'TV-14'}, 
          	{'Genre': u'Drama'}, 
          	{'Studio': u'ABC (US)'}, 
          	{'Status': u'Ended'}, 
          	{'Jahr': u'2007'}, 
          	{'Thumb': u'http://www.thetvdb.com/banners/episodes/80542/1499371.jpg'}, 
          	{'FirstAired': u'2010-01-14'}, 
          	{'RunningTime': u'55'}, 
          	{'Poster': u'http://thetvdb.com/banners/posters/80542-6.jpg'}, 
          	{'WatchType': u'Internationale Serien'}, 
        {'TVShow': u'Navy CIS'}, 
          	{'Staffel': u'6'}, 
          	{'Episode': u'11'}, 
          	{'Title': u'Stille Nacht'}, 
          	{'Starttime': u'11:35'}, 
          	{'Datum': u'12.04.2016'}, 
          	{'neueEpisode': u''}, 
          	{'Channel': u'Fox HD'}, 
          	{'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5cfox%20hd.png/'}, 
          	{'PVRID': u'36'}, {'Description': u'Kurz vor dem Heiligabend wird ein \xe4lteres Ehepaar in seinem Haus \xfcberfallen und ermordet. Die Beschreibung eines Zeugen sowie Fingerabdr\xfccke am Tatort f\xfchren die Polizei auf die Spur des Navy-Sanit\xe4ters Ned Quinn, ein Vietnam-Veteran, der bei einem Brand im Jahre 1991 ums Leben gekommen sein soll ...'}, 
          	{'Rating': u'7.5'}, 
          	{'Altersfreigabe': u'TV-14'}, 
          	{'Genre': u'Action | Adventure | Crime | Drama'}, 
          	{'Studio': u'CBS'}, {'Status': u'Continuing'}, 
          	{'Jahr': u'2003'}, 
          	{'Thumb': u'http://www.thetvdb.com/banners/episodes/72108/404893.jpg'}, 
          	{'FirstAired': u'2008-12-16'}, 
          	{'RunningTime': u'45'}, 
          	{'Poster': u'http://thetvdb.com/banners/posters/72108-14.jpg'}, 
          	{'WatchType': u'Internationale Serien'}]
mein Ergebnis soll aber so aussehen

Code: Alles auswählen

listitem_str [{'TVShow': u'Private Practice',
          	'Staffel': u'3', 
          	'Episode': u'11', 
          	'Title': u'Noch eine zweite Chance', 
          	'Starttime': u'11:25', 
          	'Datum': u'12.04.2016', 
          	'neueEpisode': u'', 
          	'Channel': u'SIXX HD', 
          	'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5csixx%20hd.png/', 
          	'PVRID': u'38', 
          	'Description': u'Addison und ihr Exkollege Doktor Mark Sloan, dessen schwangere Tochter sie in Los Angeles operieren soll, finden angesichts beidseitig schwieriger Lebenssituationen Trost beieinander. Damit sorgen sie f\xfcr Aufregung in der Praxis und handeln sie sich neue Probleme ein. Cooper zeigt sich von seiner unerbittlichen Seite, sowohl gegen\xfcber seiner Freundin Charlotte wie auch einer kranken Mutter gegen\xfcber, der er das Sorgerecht f\xfcr ihren Sohn entziehen will.', 
          	'Rating': u'7.2', 
          	'Altersfreigabe': u'TV-14', 
          	'Genre': u'Drama', 
          	'Studio': u'ABC (US)', 
          	'Status': u'Ended', 
          	'Jahr': u'2007', 
          	'Thumb': u'http://www.thetvdb.com/banners/episodes/80542/1499371.jpg', 
          	'FirstAired': u'2010-01-14', 
          	'RunningTime': u'55', 
          	'Poster': u'http://thetvdb.com/banners/posters/80542-6.jpg', 
          	'WatchType': u'Internationale Serien'}, 
        {'TVShow': u'Navy CIS', 
          	'Staffel': u'6', 
          	'Episode': u'11', 
          	'Title': u'Stille Nacht', 
          	'Starttime': u'11:35', 
          	'Datum': u'12.04.2016', 
          	'neueEpisode': u'', 
          	'Channel': u'Fox HD', 
          	'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5cfox%20hd.png/', 
          	'PVRID': u'36'}, {'Description': u'Kurz vor dem Heiligabend wird ein \xe4lteres Ehepaar in seinem Haus \xfcberfallen und ermordet. Die Beschreibung eines Zeugen sowie Fingerabdr\xfccke am Tatort f\xfchren die Polizei auf die Spur des Navy-Sanit\xe4ters Ned Quinn, ein Vietnam-Veteran, der bei einem Brand im Jahre 1991 ums Leben gekommen sein soll ...', 
          	'Rating': u'7.5', 
          	'Altersfreigabe': u'TV-14'}, 
          	'Genre': u'Action | Adventure | Crime | Drama', 
          	'Studio': u'CBS'}, {'Status': u'Continuing', 
          	'Jahr': u'2003', 
          	'Thumb': u'http://www.thetvdb.com/banners/episodes/72108/404893.jpg', 
               'FirstAired': u'2008-12-16', 
          	'RunningTime': u'45', 
          	'Poster': u'http://thetvdb.com/banners/posters/72108-14.jpg', 
          	'WatchType': u'Internationale Serien'}]
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: wenn Du das nicht so haben willst, solltest Du eben nicht für jedes Feld ein eigenes Wörterbuch erzeugen.

Code: Alles auswählen

listitems.append(dict(zip(properties, data)))
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

@Sirius3: genau das wollte ich haben... Also alles was mit Listen und Dictionarys zu tun hat ist im Moment noch sehr verwirrend für mich...

Danke für die Erklärung!

Kurze Frage noch, nach dem return listitems ist dann schluß, weitere folgende Befehle werden nicht mehr abgearbeitet, oder?

sieht jetzt bei mir so aus:

Code: Alles auswählen

def refreshWidget(category, offset=0):

    listitems = []

    conn = sqlite3.connect(SerienPlaner)
    cur = conn.cursor()
    query = """SELECT %s
           FROM TVShowData
           WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
           %s
           ORDER BY StartTime
           LIMIT 15"""
    if category == __LS__(30116):
        filter = ""
        parameters = ()
    else:
        filter = " AND WatchType = ?"
        parameters = (category,)        

    query = query % (','.join(properties), filter)
    cur.execute(query, parameters)
    for idx, data in enumerate(cur, offset):
        for field, item in zip(properties, data):     
            
            WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
            
            listitems.append(dict(zip(properties, data)))          

    return listitems


    cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
    conn.commit()
    conn.close()

aber das löschen wird nicht mehr ausgeführt...
BlackJack

@sveni_lee: Richtig, nach der Ausführung einer ``return``-Anweisung wird in einer Funktion nichts anderes mehr ausgeführt, ausser das ``return`` steht in einem ``try``-Block und es gibt einen ``finally``-Zweig, oder das ``return`` steht in einem ``with``-Block, dann wird noch der ”Aufräumcode” vom Kontextmanager ausgeführt, der zu dem ``with`` gehört.

Die Datenbankabfragen haben in dem Code übrigens eine ”Dynamik” erreicht wo ich aufhören würde SQL-Anweisungen als Zeichenketten zusammen zu basteln und auf eine Abstraktion wie `SQLAlchemy` zurückgreifen würde. Und wenn man das schon einsetzt, kann man sich auch gleich noch überlegen das ORM davon zu verwenden.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:Richtig, nach der Ausführung einer ``return``-Anweisung wird in einer Funktion nichts anderes mehr ausgeführt, ausser das ``return`` steht in einem ``try``-Block und es gibt einen ``finally``-Zweig, oder das ``return`` steht in einem ``with``-Block, dann wird noch der ”Aufräumcode” vom Kontextmanager ausgeführt, der zu dem ``with`` gehört.
ich hab das ganze mal in einen ``try``-Block gepackt aber irgendwie wird das löschen trotzdem nicht ausgefügrt...
Die Daten werden aber mit ``return`` übergeben

Code: Alles auswählen

def refreshWidget(category, offset=0):

    listitems = []

    conn = sqlite3.connect(SerienPlaner)
    cur = conn.cursor()
    query = """SELECT %s
           FROM TVShowData
           WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
           %s
           ORDER BY StartTime
           LIMIT 15"""
    if category == __LS__(30116):
        filter = ""
        parameters = ()
    else:
        filter = " AND WatchType = ?"
        parameters = (category,)        

    query = query % (','.join(properties), filter)
    cur.execute(query, parameters)
    try:
        for idx, data in enumerate(cur, offset):
            for field, item in zip(properties, data):     
            
                WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
            
                listitems.append(dict(zip(properties, data)))          

        return listitems
    except:
        pass

    cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
    conn.commit()
    conn.close()
BlackJack hat geschrieben:Die Datenbankabfragen haben in dem Code übrigens eine ”Dynamik” erreicht wo ich aufhören würde SQL-Anweisungen als Zeichenketten zusammen zu basteln und auf eine Abstraktion wie `SQLAlchemy` zurückgreifen würde. Und wenn man das schon einsetzt, kann man sich auch gleich noch überlegen das ORM davon zu verwenden.
wie ihr unweigerlich bemerkt haben werdet, bin ich mit den "einfachen" SQL-Abfragen ja schon überfordert... wie sol ich dann mit SQL_Alchemy klar kommen? :?:
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: wie BlackJack schon geschrieben hat, hilft einfach ein try-Block mit einem except-Block der das Programm unwartbar macht nichts, weil nur der Teil in einem finally-Block nach einem return noch ausgeführt wird. Du schreibst auch noch zu viele Wörterbücher in Deine Liste.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Das mit dem except versteh ich ja noch, dadurch wird einfach jeder Fehler abgefangen und man sieht nichts und es würde auch nichts passieren!

Gut aber wie müsste ich den try denn sonst aufbauen damit der Code noch weiter ausgeführt wird...

Ich verstehe auch nicht, wie ich meine Wörterbücher reduzieren könnte...
BlackJack

@sveni_lee: An dem ``try``-Block brauchst Du nichts ändern. Von ``except`` habe ich allerdings in dem Zusammenhang nichts geschrieben. Dafür aber von ``finally``, was Du aber nirgends verwendet hast.

Du hast ganz offensichtlich nicht verstanden/nachvollzogen was der Ausdruck von Sirius3 macht, sondern ihn einfach auf gut Glück in Deinen Code reingeschrieben. Mach Dir klar was da passiert, dann weisst Du auch wie man den *richtig* in Deinen Code integriert.

Ich denke nicht, dass SQLAlchemy die Komplexität an der Stelle tatsächlich stark erhöht, auf jeden Fall wird es deutlich weniger fehleranfällig, weil es schwerer wird kaputtes SQL zu erstellen. Was bei manuellem zusammenbasteln auf Zeichenkettenebene schnell geht. Und lesbarer wird es IMHO auch.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben: Du hast ganz offensichtlich nicht verstanden/nachvollzogen was der Ausdruck von Sirius3 macht, sondern ihn einfach auf gut Glück in Deinen Code reingeschrieben. Mach Dir klar was da passiert, dann weisst Du auch wie man den *richtig* in Deinen Code integriert.
Also der Ausdruck setzt meine Werte aus der Liste propertys in ein dictionary mit den Werten aus der SQL Datenbank und baut daraus dann wieder eine Liste... Ich das Ergebniss des Ausdrucks gedegugged und es ist genau der Aufbau den ich für die Weiterverarbeitung bebötige.
Ich denke nicht, dass SQLAlchemy die Komplexität an der Stelle tatsächlich stark erhöht, auf jeden Fall wird es deutlich weniger fehleranfällig, weil es schwerer wird kaputtes SQL zu erstellen. Was bei manuellem zusammenbasteln auf Zeichenkettenebene schnell geht. Und lesbarer wird es IMHO auch.
Okay auch das kann ich mir ansehen und ändern wenn ich das ganze mal richtig in KODI zum laufen gebracht habe.
BlackJack

@sveni_lee: Der Ausdruck „baut“ keine „Liste“. Die Liste die da am Ende heraus kommt, solltest Du Dir aber mal anschauen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:Die Liste die da am Ende heraus kommt, solltest Du Dir aber mal anschauen.
Das habe ich doch getan... Ich hatte doch geschreiben, das ich die Liste dann ins Log habe schreiben lassen um zu sehen wie sie aussieht.

in den {} ist jeweils ein datensatz vorhanden, die einzelnen Daten darin sind durch ``,`` von einander getrennt.
in der [] sind alle datensätze zusammengefasst.

Genau so sollte es aussehen damit ich es mit xbmcgui.ListItem() weiter verarbeiten kann...

Code: Alles auswählen

elif methode == 'get_item_serienplaner':
    sp_items = refreshWidget(__LS__(30116))
    writeLog('spitems %s' % (sp_items), level=xbmc.LOGDEBUG)
    url = '-'
    for sitem in sp_items:

        li = xbmcgui.ListItem()
        li.setProperty("channel", sitem['Channel'])
        li.setArt("Poster"), sitem['Poster']
        li.setProperty("plot", sitem['Description'])
        li.setProperty("staffel", sitem['Staffel'])
        li.setProperty("episode", sitem['Episode'])
        li.setProperty("starttime", sitem['Starttime'])
        li.setProperty("rating", sitem['Rating'])
        li.setProperty("senderlogo", sitem['Logo'])
        li.setProperty("genre", sitem['Genre'])
        li.setProperty("date", sitem['Datum'])
        li.setProperty("rumtime", sitem['RunningTime'])
        li.setProperty("studio", sitem['Studio'])
        li.setProperty("year", sitem['Jahr'])
        li.setProperty("altersfreigabe", sitem['Altersfreigabe'])
        li.setProperty("status", sitem['Status'])
        li.setProperty("label", sitem['Title'])
        li.setProperty("label2", sitem['TVShow'])
        li.setArt("thumb", sitem['Thumb'])
        xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
    xbmcplugin.endOfDirectory(addon_handle)
ich verstehe grad nicht, was daran so falsch ist...
BlackJack

@sveni_lee: Falsch daran ist, das diese Liste zu viele Wörterbücher enthält. Das sollte eigentlich auffallen. Oder der Quelltext den Du gezeigt hast, stimmt nicht mit dem überein, den Du tatsächlich verwendest.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:@sveni_lee: Falsch daran ist, das diese Liste zu viele Wörterbücher enthält. Das sollte eigentlich auffallen. Oder der Quelltext den Du gezeigt hast, stimmt nicht mit dem überein, den Du tatsächlich verwendest.
ich bin mir nicht sicher was genau Du meinst...

Code: Alles auswählen

def refreshWidget(category, offset=0):

    listitems = []

    conn = sqlite3.connect(SerienPlaner)
    cur = conn.cursor()
    query = """SELECT %s
           FROM TVShowData
           WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
           %s
           ORDER BY StartTime
           LIMIT 15"""
    if category == __LS__(30116):
        filter = ""
        parameters = ()
    else:
        filter = " AND WatchType = ?"
        parameters = (category,)        

    query = query % (','.join(properties), filter)
    cur.execute(query, parameters)
    try:
        for idx, data in enumerate(cur, offset):
            for field, item in zip(properties, data):     
            
                WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
            
                listitems.append(dict(zip(properties, data)))          

        return listitems
    finally:
    
        cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
        conn.commit()
        conn.close()
fallsu Das Wörterbuch "properties" vermisst, das habe ich Global abgelegt, da ich es auch an anderen stellen verwende...

Code: Alles auswählen

properties = ['TVShow', 'Staffel', 'Episode', 'Title', 'Starttime', 'Datum', 'neueEpisode', 'Channel', 'Logo', 'PVRID', 'Description', 'Rating', 'Altersfreigabe', 'Genre', 'Studio', 'Status', 'Jahr', 'Thumb', 'FirstAired', 'RunningTime', 'Poster', 'WatchType']
BlackJack

@sveni_lee: `listitems` ist falsch. Das ist zu lang. Weil Du da zu viele Wörterbücher rein steckst. Und zwar 22 mal mehr als drin sein sollten. Für jeden Datensatz hängst Du jeweils 22 gleiche Wörterbücher an. Wie kann so etwas nicht auffallen‽
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:Für jeden Datensatz hängst Du jeweils 22 gleiche Wörterbücher an
jetzt sehe bzw. verstehe ich was Du meinst...
BlackJack hat geschrieben:Wie kann so etwas nicht auffallen
weil ich mir nur den ersten und den letzt Datensatz angesehen habe...

gut ich benötige alle Werte aus properties mit den dazugehörigen Daten aus der SQL für jeden abgefragten Datensatz.
Ich wüsste nicht welches Wörterbuch ich da jetzt weg lassen kann...
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: ich würde jeweils das letzte der 22 gleichen Wörterbücher behalten und die 21 davor weglassen.
Antworten