Domanda

So che potrebbe essere qualcosa di stupido, ma ho deciso di chiedere in qualsiasi modo.

Ho cercato di interrogare qualcosa del tipo:

 cursor.execute("select col1, col2   \
                    from my_tablem \
                    where afield like '%%s%'
                    and secondfield = %s
                    order by 1 desc " % (var1, var2) )

Ma ricevo un errore nella frase simile. Non mi piace la% in più di cui ho bisogno per ottenere tutti i risultati che contiene il primo valore di% s.

idee?

TIA!

È stato utile?

Soluzione

Innanzitutto, perché non usi Django ORM per questo?

MyClass.objects.filter( aField__contains=var1, secondField__exact=var2 )

In secondo luogo, assicurati di ottenere l'SQL che ti aspetti.

stmt= "select... afield like '%%%s%%' and secondfield = '%s'..." % ( var1, var2 )
print stmt
cursor.execute( stmt )

Terzo, il tuo metodo ha una falla di sicurezza chiamata SQL Injection Attack. Non dovresti davvero fare SQL in questo modo.

Se devi assolutamente fare cose al di fuori dell'ORM di Django, devi utilizzare le variabili di bind nella tua query, non la sostituzione di stringhe. Vedi http://docs.djangoproject.com / it / dev / argomenti / db / sql / # eseguendo-raw-sql-query .

Altri suggerimenti

è possibile incidere la stringa '%' nella stringa di ricerca?

var1 = '%' + var1 + '%'

then query normally:

cursor.execute("select col1, col2 
                    from my_tablem                     where afield like %s
                    and secondfield = %s
                    order by 1 desc " , [var1, var2] )

Ho avuto un problema simile. Stavo cercando di cercare tra i campi nome concatenati. La mia query era simile a:

sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = '%%%s%%'"""

User.objects.raw(sql, [q])

Il problema era che %% stava interrompendo la mia query. La soluzione con cui ho finito è stata:

q = '%' + q + '%'
sql = """SELECT * from auth_user WHERE lower(first_name) || ' ' || lower(last_name) = %s"""

User.objects.raw(sql, [q])
Persona.objects.raw("**SELECT** id,concat_ws(' ',nombre,apellido) **AS** nombre_completo **FROM** persona **GROUP BY** id **HAVING** concat_ws(' ',nombre,apellido) **ILIKE** '%s' " % ('%%' + query + '%%'))

(Postgresql 9.1)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top