dynamische sql methoden via python scripts ?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Mittwoch 7. Februar 2007, 09:47

Hallo,

ich hab ein Problem. Ich hab auf meiner "Suchseite" etwas dynamisches, dabei handelt es sich um Projekte. Es ist so geregelt, dass ich nach unterschiedlich vielen Projekten Suchen kann. Diese Projekte sind in einer MySQL Datenbank und ich möchte, bei mehreren Projekten, eine "Oder" abfrage machen, beispiel: "SELECT * FROM projekte WHERE titel='projekt1' Or titel='projekt2' OR titel='projekt99'"
So wenn aber in der Suche nur nach 2 Projekten gesucht wird, soll sich auch das SQL Statement anpassen auf die beiden Projekttitel!

Ist so was möglich oder sind solche Z SQL Methoden nur statisch ?

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

Mittwoch 7. Februar 2007, 14:02

mitch hat geschrieben:"SELECT * FROM projekte WHERE titel='projekt1' Or titel='projekt2' OR titel='projekt99'"
Hi mitch!

Verwende stattdessen den IN-Operator.

http://dev.mysql.com/doc/refman/5.1/en/ ... ators.html

Code: Alles auswählen

SELECT * FROM projekte WHERE titel IN ('projekt1', 'projekt2', 'projekt99')
Du kannst aber auch mit ``dtml-sqltest`` und/oder ``dtml-sqlgroup`` arbeiten.

Die Hilfe dazu findest du im ZMI in der Hilfe unter "Zope Help" > "DTML Reference" > "sqlvar". Und auch, wenn du in der Zope-Hilfe nach "SQL" suchst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 7. Februar 2007, 14:16

Hi!

Ich glaube, so sollte es funktionieren:

Code: Alles auswählen

SELECT 
  * 
FROM 
  projekte 
<dtml-sqlgroup where>
  <dtml-sqltest titel type=string multiple optional>
</dtml-sqlgroup>
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
mitch
User
Beiträge: 78
Registriert: Dienstag 1. August 2006, 09:07
Kontaktdaten:

Donnerstag 8. Februar 2007, 13:30

Hi gerold,

danke für deine Antworte, ich habe es jetzt erstmal so gelöst:

Code: Alles auswählen

#ich hole mir die anzahl der Projekte, nach denen gesucht wird aus dem Request
projekteAnzahl=context.REQUEST.get('projekteAnzahl')
projekteAnzahl=int(projekteAnzahl)

#request mal verkürzen
request=context.REQUEST

#eine liste machen für die mitarbeiter die in den gesuchten projekten mitarbeiten
ret_list = []
zaehler=0
projekt='projekt'
if projekteAnzahl>=1:
 while zaehler < projekteAnzahl:
  zaehler=zaehler+1
  zaehlerString=str(zaehler)
  #da die nach unterschiedlich vielen projekten gesucht werden kann, habe ich auch die Namen der Dropdowns dynamisch erstellt bsp.:projekt1,projekt2 etc und als Value hab ich den Index aus der MySQL DB vergeben den ich dann abrufe
  projektH=projekt+zaehlerString
  projektId=request.get(projektH)
  #getMitarbeiterId_prid ist eine SQLmethode, somit bekomme ich aus der Kreuztabelle zw Mitarbeiter und Projekt die MitarbeiterNummer raus
  mitarbeiterNummer=context.getMitarbeiterId_prid(pr_id=projektId)
  flag=1
  #nun gehe ich alle gefunden einträge durch
  for mitarbeiterNumme in mitarbeiterNummer:
   ret_list_laenge=len(ret_list)
   zaehler2=0
   #die while schleife ist dafür da, dass fals nach mehreren Projekten gesucht wird, in dem aber ein und der gleiche Mitarbeiter ist, dieser nur einmal eingetragen wird in meine liste ret_list
   while zaehler2<ret_list_laenge:
    if mitarbeiterNumme.ma_id == ret_list[zaehler2]:
     zaehler2=zaehler2+1
     flag=1
     break
    else:
     zaehler2=zaehler2+1
     flag=0
   if flag==0 or ret_list_laenge==0:
    ret_list.append(mitarbeiterNumme.ma_id)  
#wenn projekte ignoriert werden sollen, gebe ich alle mitarbeiter wieder
else:
 mitarbeiter=context.getMitarbeiter()
 for mitarbeite in mitarbeiter:
  ret_list.append(mitarbeite.ma_id)
Hier der code der SQL Methode:

Code: Alles auswählen

SELECT * FROM mitarbeiter 
INNER JOIN mitarbeiter_projekt 
ON mitarbeiter.ma_id = mitarbeiter_projekt.ma_nr  
WHERE mitarbeiter_projekt.pr_nr LIKE <dtml-sqlvar pr_id type=string>
Bei meinem Vorgang führe ich sehr oft eine Abfrage auf die Datenbank los, kostet mich das sehr viel Ressourcen?

mfg mitch
Antworten