[Python] query con MySQL

Crash Override crash.ovd a gmail.com
Sab 2 Feb 2008 12:25:06 CET


Daniele Varrazzo ha scritto:
> Crash Override ha scritto:
>   
>> Buongiorno.
>> Dopo aver letto sulla documentazione la giusta sintassi per inserire una 
>> stringa 'esterna' in una query MySQL con Python, scrivo (in un'oppurtuna 
>> funzione):
>>     
>
> Ciao,
>
> aiuterebbe avere un po' più di contesto, ricordatene quando chiedi una mano :) 
> Manda un paio di righe in più della funzione di cui parli: non solo la stringa 
> SQL ma anche come la usi, perché il problema è (anche) lì.
>
>   
>> '''select qualcosa from qualcosaltro WHERE qualcosa = % (nomeStringa) s'''
>>     
>
> di sicuro gli spazi in '% (nomeStringa) s' non servono. Questo non viene 
> riconosciuto come segnaposto. Scrivi '%(nomeStringa)s'.
>
>   
>> dove nomeStringa lo prendo da un EvtText di una TextCtrl. Ecco... la 
>> query non dà rsultati! Il nome (nomeStringa) esiste perchè se lo scrivo 
>> io all'interno della query funziona! Inoltre ho provato a far stampare 
>> in un wx.dialog il testo della TextCtrl: è tutto 'regolare'. Il problema 
>> qualè? La TextCtrl aggiunge qualcosa che devo 'opportunamete' eliminare? 
>> Non mi sembra...
>> La stringa è presa da una funzione EvtText(evt) come evt.GetString().
>>     
>
> Cos'è nomeStringa? Il nome di una variabile locale? Dovrebbe essere la chiave 
> di un dizionario passato come secondo argomento al metodo execute() del 
> cursore. Per intenderci da te ci si aspetta:
>
>      cnn = MySQLdb.connect(dsn)
>      cur = cnn.cursor()
>
>      sql = '''select qualcosa from qualcosaltro
>               WHERE qualcosa = %(nomeStringa)s'''
>      args = { 'nomeStringa': 'mio valore' }
>
>      cur.execute(sql, args)
>
>      for record in cur:
>          ...
>
>   
Ho capito ora che forse il parametro va passato alla execute e non 
direttamente come stringa sql. Dunque ho scritto una cosa del genere:

def onQueryCustom(query, parameter):
    #creo una connessione con il database MySQL

    conn = MySQLdb.connect(host = "localhost", user = "root", passwd= " 
... ", db = " ... ")

   
    #creo un cursore che mi permette di operare sulle tabelle del db

    cur = conn.cursor()
   
    #eseguo la query
    cur.execute(query, parameter)
   
    #ottengo il risultati
   
    tupleResult = cur.fetchall()
    #chiudo la connessione con il db
    listResult = list(tupleResult)
    conn.close()
   
    return listResult


la stessa di prima col parametro :)

quindi self.filmResult = onQueryCustom('''SELECT final.titolo, 
final.nazione, final.nome_cdp, final.anno, final.genere, final.trama,
                                      final.durata, 
p.locandina,p.fotobook, p.trailerbreve,
                                      p.trailerlungo FROM(SELECT 
info.idfilm, info.nazione, info.nome_cdp, info.anno,
                                      info.titolo, info.genere, 
info.trama, info.durata
                                      from(SELECT * FROM realizzazione 
natural join film) AS info WHERE info.titolo = '%(titoloF)s')
                                      as final
                                       natural join pubblicita p''', 
titoloF)

però ora Python mi dà quest'errore :
query = query % db.literal(args)
TypeError: format requires a mapping


Grazie
P
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20080202/cb357b81/attachment.htm 


More information about the Python mailing list