<div class="gmail_quote">2012/3/20 Stefano Dal Pra <span dir="ltr"><<a href="mailto:s.dalpra@gmail.com">s.dalpra@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div id=":3eo">Non so se ho capito bene cosa ti serve, ma con questo:<div class="im"><br>keys = [<br>    ("LDAP server", "Agent"),<br>    ("-LDAP-server-", "_S-"),<br>    ("Pippo'", "'pluto"),<br>

</div>

    ("Pippo", None),<br>    ("Pippo", "")<br>]<br><br>T=[]<br>for a,b in keys:<br>    print q.curs.mogrify("select trim(%s|| coalesce( '_'||%s,'' ),'_');",(a,b))<br>



    q.curs.execute("select trim(%s|| coalesce( '_'||%s,'' ),'_');",(a,b))<br>    T.append(q.curs.fetchone()[0])<br><br>print '\n'.join(T)<br><br><br>Ottengo:<br>>>> T=[]<br>



>>> for a,b in keys:<br>...     print q.curs.mogrify("select trim(%s|| coalesce( '_'||%s,'' ),'_');",(a,b))<br>...     q.curs.execute("select trim(%s|| coalesce( '_'||%s,'' ),'_');",(a,b))<br>



...     T.append(q.curs.fetchone()[0])<br>... <br>select trim('LDAP server'|| coalesce( '_'||'Agent','' ),'_');<br>select trim('-LDAP-server-'|| coalesce( '_'||'_S-','' ),'_');<br>



select trim('Pippo'''|| coalesce( '_'||'''pluto','' ),'_');<br>select trim('Pippo'|| coalesce( '_'||NULL,'' ),'_');<br>select trim('Pippo'|| coalesce( '_'||'','' ),'_');<br>



>>> print '\n'.join(T)<br>LDAP server_Agent<br>-LDAP-server-__S-<br>Pippo'_'pluto<br>Pippo<br>Pippo<br><br>Ciao<br>Stefano</div></blockquote></div><br><div><br></div><div>Ciao Stefano,</div><div>

<br></div><div>cerco di essere più chiaro</div><div><br></div><div>SELECT NAME, AUTHOR FROM BOOK;</div><div><br></div><div>sono 2 campi della tabella book, ma non sono semplici campi sono la primary key composta della tabella book.</div>

<div><br></div><div>ora, in django non è possibile fare una cosa del genere a meno che di aggiungere una ulteriore colonna ID auto increment e fregarsene che la tabella è relazionata cosi.</div><div><br></div><div>Chiaramente se dovessi modellare tu il database la tabella chapters la metteresti con una ForeignKey verso la colonna ID della tabella book, ma... se il db è di una aplpicazione già fatta che non puoi toccare?</div>

<div><br></div><div>è qui che entra il progetto che stò scrivendo che ha lo scopo di dare la possibilità di usare chiavi composte usando i modelli django.</div><div><br></div><div>quindi di fatto la tabella chapter avrà 2 colonne book_author e boor_name che identificano la relazione book->chapters.</div>

<div><br></div><div><br></div><div>Ora, fino qui è facile, e anche gestire lato python la cosa è facile, il casino viene quando confrontiamo questa realtà con il concetto di relazioni generiche di django, dove una qualsiasi tabella, admin logs, tagging, messages, threads, possono essere legate a un QUALSIASI modello.</div>

<div><br></div><div>Quindi si usa una relazione datta fa ContentType e content_id. Dove il content_id è la chiave della tabella. </div><div><br></div><div>Nell'esempio book, name e author sono entrambe parti della chiave, quindi cosa ci sriviamo nella tabella che ha una rel generica? (ad esempio quella dei tags) </div>

<div><br></div><div>in prima battuta c'ho messo una concatenazione lato python delle chiavi univoche, e ho realizzato la librerie. Funziona in tutto e per tutto tranne in una funzionalità, ossia "dammi tutti i tags relazionati a questi oggetti", che avviene tramite una SELECT che mette in join la tabella book con la tabella tags.</div>

<div><br></div><div>Chiaramente visto che la chiave l'ho calcolata con python, non sono ingrado di fare una join e quindi prima mi devo prendere tutte le chiavi, poi devo produrre le concatenazioni e infine devo fare la queri con select in [pks]. COMPLETAMENTE NON PERFORMANTE</div>

<div><br></div><div>Quindi di fattos to cercando un modo di avere una funzione python che sia ingrado di fare la concatenazione e il contrario, ma che abbia una sua implementazione (almeno la concatenazione) lato DATABASE.</div>

<div><br></div><div>Cross database, quindi sia SQLITE, PGSQL, ORACLE, MYSQL (etc...)</div><div><br></div><div>Quindi la domanda riguarda la sintassi SQL non la sintassi python. </div><div>Comunque la soluzione che proponi purtroppo non è univoca, perche manca del quoting delle colonne altrimenti non potremmo distinguere</div>

<div><br></div><div>-LDAP-server-__S- </div><div>=> </div><div>( "-LDAP-server-", "", "_S-" )</div><div>( "-LDAP-server-", "", "", "S-" )</div><div>

( "-LDAP-server-", "_", "S-" )</div><div><br></div><div>per questo nella concatenazione c'è bisogno di fare il quoting con apice singolo delle colonne e anche l'escaping sempre dell'apice singolo.</div>

<div><br></div><div><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">'</span><font color="#ff0000" style="font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">-LDAP-server-</font><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">'_'</span><font color="#ff0000" style="font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">_S-</font><span style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">'</span></div>

<div>da notare che qui i 2 underscore sono di facile comprensione, uno è unn separatore, l'altro è parte della contenuto, basta contare il numero di apici alla sua sinistra se è pari è un separatore.</div><div><br></div>

<div>ciao</div><div>Simone</div>