Abfrage SQlite Datenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Sirius3 hat geschrieben:@sveni_lee: das Datum sollte Dir als datetime Objekt zur Verfügung stehen, so kommt es in die Datenbank hinein, und so kommt es auch wieder raus.
sorry aber da steh ich auf'm Schlauch... wie ist das gemeint?

soll ich schon den insert ändern, so das es gar nicht erst in unicode gewandelt wird?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: dass Du nicht alles in Strings umwandeln sollst, hab ich schon im ersten Post geschrieben. Jede Größe hat einen natürlichen Typ, Zahlen sind je nachdem int oder float, Datum ist datetime. Gleich nach dem Einlesen sollte man alles in den richtigen Typ umwandeln und erst beim Rausschreiben in Strings. Datenbanken können dabei eben mit vielen Typen richtig umgehen, so dass ein Konvertieren in Strings falsch ist.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ich habe jetzt mal das unicode entfernt und es als datetime in die db eingefügt...
und die db neu aufgebaut.

Aber ich muß doch trotzden noch alles irgendwie Millisekunden umwandeln wenn ich outdated berechnen will...
und so wie ich das verstanden habe benötige ich dafür ja einen kompletten string mit datum und uhrzeit.
BlackJack

@sveni_lee: Wieso musst Du wenn Du `datetime`-Objekte hast irgend etwas in Millisekunden umrechnen? Mit `datetime`-Objekten kann man rechnen. Zieh die voneinander ab und schau Dir das `timedelta`-Objekt an was Du dabei bekommst, beziehungsweise erstell ein `timedelta`-Objekt das die entsprechende Zeitspanne ”wert” ist und vergleiche auf grösser oder kleiner mit der Differenz, je nach dem was genau Du testen möchtest.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@sveni-lee: Hier ein Beispiel:

Code: Alles auswählen

>>> import datetime as dt
>>> t1 = dt.datetime.now()                                                      
>>> delta = dt.timedelta(14)                                                    
>>> t2 = t1 - delta
>>> str(t1)                                                                     
'2016-04-08 19:51:50.968163'
>>> str(t2)                                                                     
'2016-03-25 19:51:50.968163'
>>> str(t1.date())
'2016-04-08'
>>> str(t2.date())                                                              
'2016-03-25'
Mehr dazu in der Doku.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: Sqlite3 wandelt ein Datetime-Objekt automatisch in ein passendes Format, das man dann in eine Zahl zum Rechnen verwenden kann:

Falls Runtime also in Minuten ist, selektiert man hier alle noch laufenden Sendungen:

Code: Alles auswählen

cursor.execute("select * from TVShowData where julianday(StartTime) + (Runtime / 24.0 / 60.0) > julianday('now', 'localtime') ")
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

hmmm... das ganze sieht jetzt so aus..

Code: Alles auswählen

def refreshWidget(category, offset=0):

    conn = sqlite3.connect(SerienPlaner)
    cur = conn.cursor()
    cur.execute(""" SELECT %s FROM TVShowData WHERE julianday(StartTime) + (RunningTime / 24.0 / 60.0) > julianday('now', 'localtime') ORDER BY StartTime LIMIT 15""" % ','.join(properties))
    for idx, data in enumerate(cur, offset):
        for field, item in zip(properties, data):     
            
            WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
das bringt jetzt keine Fehlermeldung mehr aber auch kein Ergebnis...
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ich habe jetzt mal die zeitberechnung weggelassen, jetzt kommt folgende Fehlermeldung:

Code: Alles auswählen

WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
 TypeError: argument "value" for method "setProperty" must be unicode or str
also zeile abgeändert

Code: Alles auswählen

WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))
bringt leider auch kein Ergebnis
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

jetzt verste ich gar nichts mehr...
ich hab alles wieder zurückgesetzt wie es vorher war und jetzt kommt gar nichts mehr an...
ich bekomme jetzt keine Daten mehr angezeigt obwohl das schon einmal ging... :oops:

Ich weiß nicht mehr wo der Fehler ist... hab ersteinmal wieder alles auf unicode gesetzt und
die datetime Berechnung rausgenommen...

Aber es kommt nichts mehr in Kodi an...

darauf habe ich versucht einen debug einzubauen

Code: Alles auswählen

writeLog('Setting Properties SerienPlaner.%d.%s' % ((idx, field), item), level=xbmc.LOGDEBUG)
kommt aber folgende Fehlermeldung

Code: Alles auswählen

TypeError: %d format: a number is required, not tuple

EDIT:

okay hab einen Fehler gefunden, ich weiß nicht warum aber in meiner properties-Liste hat TVShow gefehlt, dadurch wurden alle Items nicht angezeigt.

Die Berechnung scheint allerdings nicht zu funktionieren...

ich bekomme grad Serien Angezeigt, die um 21:15 begonnen hat und 55min dauern sollte...somit um 22:10 zu ende wäre...
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

so, outdated funktioniert jetzt auch...
ich habe noch ein zusätzliches Feld in die Datenbank aufgenommen "starttimestamp" dieser wert besteht aus Datum und Uhrzeit incl. Sekunden, damit funktioniert es dann...

Als nächstes werde ich nun versuchen eine zweite WHERE Variable einzubauen... und Zwar Watchtype, das kann internationale Serie, Klassiker, Deutsche Serie und Soap sein. Vor dem Scrapen wird festgelegt welche categorien gescraped werden sollen, das klappt auch schon.
default werden alle die items aus allen im scraper gewählen Kategorien angezeigt...

Über einen Guiaufruf kann aber auch nur eine Kategorie gezielt ausgewählt werden...

Ich hatte mir das so vorgestellt das beim def aufruf eine der wert für die Kategorie mit übergeben wird...

das sollte doch so machbar sein oder?
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ich habe jetzt noch einen Code zum löschen der outdated TvShows angehangen, damit werden dann auch alle abgelaufenen Sendungen aus der
Datenbank gelöscht.

Code: Alles auswählen

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

nun würde ich gern noch eine zweite Variable bei der Abfrage einbringen, so das man auch die watchtypes wählbar machen kann...
ich hatte es folgender Maßen probiert...

Zum Testen habe habe ich eine category fest forgegeben..

Code: Alles auswählen

cur.execute(""" SELECT %s FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime') AND WatchType = %s ORDER BY StartTime LIMIT 15""" % ','.join(properties), category)


aber ich bekomme eine Fehlermeldung...

Code: Alles auswählen

TypeError: not enough arguments for format string
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommen jetzt die Unterstriche bei den ganzen Spaltennamen?
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

das sind die Daten in datetime-Format... habe ich befelfsweise gemacht, da ich WINDOW.setProperty nur unicode oder str. akzeptiert
und für die Berechung der timestamp mit Datum und Uhrzeit besser funktioniert hat...

meine Abfrage habe ich mittlerweileauch abgeändert...

Code: Alles auswählen

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)


funktioniert soweit auch schon sehr gut... und ich kann die Abfrage noch um zwei, drei weitere Variablen erweitern...

Nun habe ich meinem Kodi-plugin einige Settings die ich noch umsetzen muss...mal schaun, wie ich damit zurecht komme...
BlackJack

@sveni_lee: Das wird ja immer schräger. Lass irgendwelche komischen Kennzeichnungen bei Spaltennamen für Datentypen weg und was `WINDOW.setProperty` an Datentypen akzeptiert hat nichts, aber auch gar nichts damit zu tun als welchen Datentyp man Werte im Programm verarbeitet oder in einer Datenbank speichert. Dafür nimmt man die Datentypen die zu den Daten passen und nicht grundsätzlich Zeichenketten weil man das irgendwann mal in dem Format für die Darstellung benötigen könnte. Daten sollten beim betreten des Programms in ein Format gewandelt werden in dem man sie *verarbeiten* kann, also beispielsweise Zahlen wenn es Zahlen sind und Typen aus dem `datetime`-Modul wenn es sich um Zeit- oder Datumsangaben handelt. Und nur für die Ausgabe und auch nur dort kann man dann entsprechende Zeichenketten erstellen, die dem Benutzer angezeigt werden.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ja, das ist mir schon klar... diese dinge könne sicher auch noch geändert werden...
Allerdings ist es mein ersres Plugin und ich bin meinem eigendlichen Ziel noch nicht viel näher gekommen.
Bis jetzt habe ich erst einmal versucht das sammeln und verarbeiten der Daten in den Griff zu bekommen...

eventuell würde das auch so gehen:

Code: Alles auswählen

WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), unicode(item))

dann muß ich generell nichts mehr vorher umwandeln.

davon ab ist mein primäres Ziel auf das Einfügen von unzälligen Items in Kodi zu verzichten und den Kontent in eine Programmaufrufzeile
zu packen... dazu nusste ich aber ersteinmal die Daten haben was ja jetzt schon mal funktioniert.
Im endeffekt stell ich mir das so vor:

Code: Alles auswählen

plugincontent.doMainListing(params.get("content_type",[""])[0])

Code: Alles auswählen

def doMainListing(mode=""):
    xbmcplugin.setContent(int(sys.argv[1]), 'files')
    
    if mode=="video" or not mode:       
        if xbmc.getCondVisibility("System.HasAddon(plugin.program.serinplaner)"):
            addDirectoryItem(ADDON.getLocalizedString(32055), "plugin://script.skin.helper.service/?action=serienplaner&limit=100")

Und dann kommt der Teilden ich nicht komplett verstehe...

die JSON-Abfrage holt einige Daten aus der Kodi.db, was ich nicht brauche...
ich muß halt irgendwie einen Loop erzeugen, der die entsprechen Properties aus meinem Plugin abholt...

Code: Alles auswählen

def NEXTAIREDTVSHOWS(limit):
    count = 0
    allItems = []
    #get data from next aired script
    nextairedTotal = WINDOW.getProperty("NextAired.Total")
    if nextairedTotal:
        nextairedTotal = int(nextairedTotal)
        for count in range(nextairedTotal):
            tvshow = WINDOW.getProperty("NextAired.%s.Label"%str(count)).decode("utf-8")
            if tvshow:
                json_result = getJSON('VideoLibrary.GetTvShows','{ "filter": {"operator":"is", "field":"title", "value":"%s"}, "properties": [ %s ] }' %(tvshow,fields_tvshows))
                if len(json_result) > 0:
                    item = json_result[0]
                    extraprops = {}
                    extraprops["airtime"] = WINDOW.getProperty("NextAired.%s.AirTime"%str(count)).decode("utf-8")
                    extraprops["Path"] = WINDOW.getProperty("NextAired.%s.Path"%str(count)).decode("utf-8")
                    extraprops["Library"] = WINDOW.getProperty("NextAired.%s.Library"%str(count)).decode("utf-8")
                    extraprops["Status"] = WINDOW.getProperty("NextAired.%s.Status"%str(count)).decode("utf-8")
                    extraprops["StatusID"] = WINDOW.getProperty("NextAired.%s.StatusID"%str(count)).decode("utf-8")
                    extraprops["Network"] = WINDOW.getProperty("NextAired.%s.Network"%str(count)).decode("utf-8")
                    extraprops["Started"] = WINDOW.getProperty("NextAired.%s.Started"%str(count)).decode("utf-8")
                    extraprops["Genre"] = WINDOW.getProperty("NextAired.%s.Genre"%str(count)).decode("utf-8")
                    extraprops["Premiered"] = WINDOW.getProperty("NextAired.%s.Premiered"%str(count)).decode("utf-8")
                    extraprops["Country"] = WINDOW.getProperty("NextAired.%s.Country"%str(count)).decode("utf-8")
                    extraprops["Runtime"] = WINDOW.getProperty("NextAired.%s.Runtime"%str(count)).decode("utf-8")
                    extraprops["Fanart"] = WINDOW.getProperty("NextAired.%s.Fanart"%str(count)).decode("utf-8")
                    extraprops["Today"] = WINDOW.getProperty("NextAired.%s.Today"%str(count)).decode("utf-8")
                    extraprops["NextDate"] = WINDOW.getProperty("NextAired.%s.NextDate"%str(count)).decode("utf-8")
                    extraprops["NextDay"] = WINDOW.getProperty("NextAired.%s.NextDay"%str(count)).decode("utf-8")
                    extraprops["NextTitle"] = WINDOW.getProperty("NextAired.%s.NextTitle"%str(count)).decode("utf-8")
                    extraprops["NextNumber"] = WINDOW.getProperty("NextAired.%s.NextNumber"%str(count)).decode("utf-8")
                    extraprops["NextEpisodeNumber"] = WINDOW.getProperty("NextAired.%s.NextEpisodeNumber"%str(count)).decode("utf-8")
                    extraprops["NextSeasonNumber"] = WINDOW.getProperty("NextAired.%s.NextSeasonNumber"%str(count)).decode("utf-8")
                    extraprops["LatestDate"] = WINDOW.getProperty("NextAired.%s.LatestDate"%str(count)).decode("utf-8")
                    extraprops["LatestDay"] = WINDOW.getProperty("NextAired.%s.LatestDay"%str(count)).decode("utf-8")
                    extraprops["LatestTitle"] = WINDOW.getProperty("NextAired.%s.LatestTitle"%str(count)).decode("utf-8")
                    extraprops["LatestNumber"] = WINDOW.getProperty("NextAired.%s.LatestNumber"%str(count)).decode("utf-8")
                    extraprops["LatestEpisodeNumber"] = WINDOW.getProperty("NextAired.%s.LatestEpisodeNumber"%str(count)).decode("utf-8")
                    extraprops["LatestSeasonNumber"] = WINDOW.getProperty("NextAired.%s.LatestSeasonNumber"%str(count)).decode("utf-8")
                    extraprops["AirDay"] = WINDOW.getProperty("NextAired.%s.AirDay"%str(count)).decode("utf-8")
                    extraprops["ShortTime"] = WINDOW.getProperty("NextAired.%s.ShortTime"%str(count)).decode("utf-8")
                    extraprops["SecondWeek"] = WINDOW.getProperty("NextAired.%s.SecondWeek"%str(count)).decode("utf-8")
                    extraprops["Art(poster)"] = WINDOW.getProperty("NextAired.%s.Art(poster)"%str(count)).decode("utf-8")
                    extraprops["Art(fanart)"] = WINDOW.getProperty("NextAired.%s.Art(fanart)"%str(count)).decode("utf-8")
                    extraprops["Art(landscape)"] = WINDOW.getProperty("NextAired.%s.Art(landscape)"%str(count)).decode("utf-8")
                    extraprops["Art(clearlogo)"] = WINDOW.getProperty("NextAired.%s.Art(clearlogo)"%str(count)).decode("utf-8")
                    extraprops["Art(clearart)"] = WINDOW.getProperty("NextAired.%s.Art(clearart)"%str(count)).decode("utf-8")
                    extraprops["Art(characterart)"] = WINDOW.getProperty("NextAired.%s.Art(characterart)"%str(count)).decode("utf-8")
                    item["extraproperties"] = extraprops
                    tvshowpath = "ActivateWindow(Videos,videodb://tvshows/titles/%s/,return)" %str(item["tvshowid"])
                    item["file"]="plugin://script.skin.helper.service?action=LAUNCH&path=" + tvshowpath
                    item["tvshowtitle"] = WINDOW.getProperty("NextAired.%s.Label"%str(count)).decode("utf-8")
                    item["title"] = WINDOW.getProperty("NextAired.%s.NextTitle"%str(count)).decode("utf-8")
                    item["season"] = WINDOW.getProperty("NextAired.%s.NextSeasonNumber"%str(count)).decode("utf-8")
                    item["episode"] = WINDOW.getProperty("NextAired.%s.NextEpisodeNumber"%str(count)).decode("utf-8")
                    allItems.append(item)
                    count += 1
                    if count == limit:
                        break
    return allItems
und das ist mein eigendliches Problem, darum bin bei der Datenaufbereitung etwas schlampig... was aber im Nachgang geändert werden soll...
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'}]
Antworten