2012-07-27 12 views
12

Sto tentando di eseguire una query per cercare 3 tabelle in un database utilizzando MySQL tramite Python. Ogni volta che provo ad eseguire la seguente stringa come una query, mi dà un errore sulla concatenazione nella stringa.Python: ValueError: carattere di formato non supportato '' '(0x27) all'indice 1

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC" 

Questo è l'errore che mi dà:

ValueError: unsupported format character ''' (0x27) at index 1 

Se rimuovo il personaggio si chiede perché allora devo togliere anche l'%, che si ferma la query dalla realtà di lavoro in modo corretto. Cosa posso fare per risolvere questo problema, dato che sono piuttosto nuovo in Python.

Grazie, Kris

+4

Utilizzare gli strumenti di sostituzione delle stringhe incorporati per lo strumento SQL invece di provare a creare la stringa di query manualmente con le meccaniche di stringa standard di Python. Funziona meglio in questo modo. Stai usando MySQLdb? –

+1

Sì, sto usando MySQLdb e dove posso trovare questi strumenti di sostituzione? – user1558746

+2

I documenti su http://mysql-python.sourceforge.net/MySQLdb.html#functions-and-attributes dicono, "Si noti che qualsiasi segno di percentuale letterale nella stringa di query passata a execute() deve essere preceduto da escape, ovvero %% ". Stai usando 'execute()'? Gli strumenti di sostituzione @Silas citati sono mostrati su http://mysql-python.sourceforge.net/MySQLdb.html#some-examples – LarsH

risposta

34

Sembra pitone sta interpretando l'% come un carattere di formato printf-like. Prova a usare %%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search) 
+0

Grazie mille, l'ha fatto! :) – user1558746

+3

Per la precisione, MySQLdb utilizza l'operatore **% ** per inserire parametri nella query, quindi qualsiasi singolo carattere **% ** nella stringa di query viene interpretato come l'inizio di un identificatore di argomento. Per impedire questo uso _ %% _ per _% _ nelle query. Consulta anche la documentazione appropriata: [formattazione delle stringhe] (http://docs.python.org/2/library/stdtypes.html#string-formatting) – Magentron

0

si può provare in questo modo:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search) 
+0

Puoi spiegare perché questo risponde alla domanda? – IanS

0

La mia soluzione:

query = """SELECT id, name FROM provice WHERE name LIKE %s""" 
cursor.execute(query, '%%%s%%' % name) 

Penso che sia modo più semplice per risolvere questo problema!

+0

Ehm, sai che la parte '%%% s %% '% name' è completamente inutile? ... Il parametro della query è il'% s' che viene sostituito dall'ORM o qualsiasi astrazione di DB che sei utilizzando ... – AuHau

Problemi correlati