MySQL - Z SQL Method in Script - iteration over non-sequence

Django, Flask, Bottle, WSGI, CGI…
Antworten
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo!

Habe leider keine Antwort und kein bereits passendes Thema zu folgendem merkwürdigen Verhalten finden können:

In Zope habe ich eine Z SQL Methode namens q_par_read angelegt:

Code: Alles auswählen

SELECT par_wert FROM par_Parameter WHERE 
par_kategorie = <dtml-sqlvar "code_utf_to_iso(par_kategorie)" type="string"> AND
par_name = <dtml-sqlvar "code_utf_to_iso(par_name)" type="string"> AND
par_geltbereich = <dtml-sqlvar "code_utf_to_iso(par_geltbereich)" type="string">
ORDER BY par_kategorie, par_name, par_geltbereich, par_wert
Sie lässt sich auch prima testen und liefert das gewünschte Ergebnis.

Nun habe ich ein Pythonscript angelegt, welches diese Abfrage folgendermaßen aufruft:

Code: Alles auswählen

sql_result = context.q_par_read(par_kategorie='Wertemenge',par_name='Startarten',par_geltbereich=0)
Leider bekomme ich immer einen Fehler:

Fehlertyp: TypeError
Fehlerwert: iteration over non-sequence

Weiß jemand, was da falsch läuft?

Über eine Antwort würde ich mich sehr freuen.

Grüße
Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:

Code: Alles auswählen

SELECT par_wert FROM par_Parameter WHERE 
par_kategorie = <dtml-sqlvar "code_utf_to_iso(par_kategorie)" type="string"> AND
par_name = <dtml-sqlvar "code_utf_to_iso(par_name)" type="string"> AND
par_geltbereich = <dtml-sqlvar "code_utf_to_iso(par_geltbereich)" type="string">
ORDER BY par_kategorie, par_name, par_geltbereich, par_wert

Code: Alles auswählen

sql_result = context.q_par_read(par_kategorie='Wertemenge',par_name='Startarten',par_geltbereich=0)
Hi Jamil!

Zwei Dinge fallen mir auf. Allerdings weiß ich nicht ob es damit zusammenhängt.

1. Teste das Ganze doch mal ohne ``code_utf_to_iso``. Vielleicht hängt es damit zusammen.

2. Du übergibst beim Aufruf ``par_geltbereich=0``, also als Integer. In der ZSQL-Methode gibst du es aber als String an. Es könnte also sein, dass du beim Testen, da du es dort ja als Text übergibst, etwas zurück bekommst. Beim Test im Python-Script übergibst du aber eine Integer-Zahl und bekommst deshalb None zurück, da nichts gefunden werden konnte.

Probier mal ``par_geltbereich = "0"`` aus. Weiters kannst du die Abfrage ja mal komplett ohne die WHERE-Bedingungen laufen lassen, damit du dir sicher gehen kannst, dass du auch wirklich etwas in das Python-Script zurück bekommst. Wenn Ja, dann liegt es an den WHERE-Bedingungen. Wenn Nein, dann gibt es sonst noch einen Fehler.

Teste auch gezielt aus, was du zurück bekommst, wenn die Abfrage kein Ergebnis von der Datenbank erhält. Bekommst du dann ein Objekt, über das du iterieren kannst oder bekommst du None zurück gegeben. Wenn du None zurück bekommst, dann musst du in deinem Python-Script auf None prüfen, bevor du zu interieren versuchst...

Mehr fällt mir nicht dazu ein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold,

erstmal wie immer vielen vielen Dank für deine tollen Mühen.

Also ich habe es zwar gelöst, werde daraus aber nicht schlau.

Oben hatte ich das Beispiel stark vereinfacht.

Eigentlich mache ich folgendes:
Ich dupliziere einen DS mit folgendem Script:

Code: Alles auswählen

DATENSATZNAME_SINGULAR = 'Parameter'
DATENSATZNAME_PLURAL = 'Parameter'

if len(edit) > 0:
  for ds_id in edit:
    # zu duplizierenden DS lesen:
    sql_result = context.q_DS_by_id(id = ds_id)
  
    # gelesenen DS duplizieren (neu anlegen):
    context.q_DS_insert(
    user = str(context.getAuthUser('id')), 
    par_kategorie = str(sql_result[0][5]), 
    par_name = str(sql_result[0][6]), 
    par_geltbereich = str(sql_result[0][7]), 
    par_wert = str(sql_result[0][8]), 
    par_beschreibung = str(sql_result[0][9]))

  if len(edit) == 1:
    return state.set(portal_status_message = 'Der %s wurde dupliziert.' %DATENSATZNAME_SINGULAR)
  else:
    return state.set(portal_status_message = 'Die %s wurden dupliziert.' %DATENSATZNAME_PLURAL)
else:
  return state.set(portal_status_message = 'Sie haben keinen %s zum Duplizieren ausgewählt.' %DATENSATZNAME_SINGULAR)
Wenn ich die Typumwandlungen str() wegnehme kommt die iteration - Fehlermeldung. Insofern hat dein Tip mir geholfen.

Die Spaltentypen in MySQL lauten:

user - VARCHAR(15)
par_kategorie, par_name - VARCHAR(25)
par_geltbereich - INTEGER
und par_wert und par_beschreibung - TINYTEXT

Das heißt alles abgesehen von par_geltbereich ist vom alphanumerischen Typ und dennoch klappt es nur, wenn ich alles als str() übergebe.
Du hast auf das type="string" in der Z SQL Methode hingewiesen. Vermutlich hängt es damit zusammen.
Was schreibe ich denn sonst für einen type="?" hin? Habe das bisher immer so gemacht, weil ich bis jetzt noch keine gute Beschreibung zu möglichen Typvarianten in Zope Z SQL Method Objekten finden konnte. Schaue nochmal ins ZOPE-Buch rein :-)

Also dann grüße ich dich!

Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ich habe eine interessante Seite gefunden. Mit diesen Informationen wird das Handling mit ZSQLMethods sehr viel einfacher. :-)

http://www.zope.org/Members/spinwing/ZSQL_Results

lg
Gerold
:-)

Stichworte: ZSQL Method ZSQLMethod
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold, super, ich werde mir das mal zu Gemüte führen, wenn meine blöde Popupliste sich endlich so verhält, wie ich es gerade will ;-)

Bis denn
Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Du hast auf das type="string" in der Z SQL Methode hingewiesen. Vermutlich hängt es damit zusammen.
Was schreibe ich denn sonst für einen type="?" hin?
Hi Jamil!

Möglich sind "string", "int", "float" oder "nb".
type
The type argument determines the way the sqlvar tag should format the value of the variable or argument being inserted in the query template. Valid values for type are string, int, float, or nb. nb stands for non-blank and means a string with at least one character in it. The sqlvar tag type argument is required.
http://www.dzug.org/Members/vbachs/zboo ... databases/

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Was würde ich nur ohne deine Unterstützung machen??

Ich denke die Hälfte meines Projekts wäre ohne deine super Hilfe noch in meinem Kopf!

Dank dir
Jamil
Antworten