Mam trudności ze zdobyciem trochę sql w pythonie, aby poprawnie przejść przez MySQLdb. To formatowanie ciągów pythonów, które mnie zabija.Formaty ciągów w języku Python za pomocą znaków wieloznacznych SQL i LIKE
Moja instrukcja sql używa słowa kluczowego LIKE z symbolami wieloznacznymi. Próbowałem wielu różnych rzeczy w Pythonie. Problem polega na tym, że gdy jeden z nich zadziała, w MySQLdb jest linia kodu, która bita na format napisu.
Próba 1:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '%%s%'" % (query)
Jest to nie udać. Otrzymuję błąd wartość:
ValueError: unsupported format character ''' (0x27) at index 128
Próba 2:
"SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username LIKE '\%%s\%'" % (query)
uzyskać ten sam wynik z próby 1.
próba 3:
like = "LIKE '%" + str(query) + "%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
to poprawnie tworzy totalq zmienna, ale teraz, gdy idę do uruchomienia kwerendy, otrzymuję błędy z MySQLdb:
File "build/bdist.macosx-10.6-universal/egg/MySQLdb/cursors.py", line 158, in execute query = query % db.literal(args) TypeError: not enough arguments for format string
Próba 4:
like = "LIKE '\%" + str(query) + "\%'" totalq = "SELECT tag.userId, count(user.id) as totalRows FROM user INNER JOIN tag ON user.id = tag.userId WHERE user.username " + like
Jest to ta sama moc jak próba 3.
To wszystko wydaje się bardzo dziwne. Jak używać symboli wieloznacznych w wyrażeniach sql z pythonem?
Aby echo @bernie poniżej: z dokumentacji psycopg: http://initd.org/psycopg/docs/usage.html#the-problem-z -the-query-parameters: "Nigdy, nigdy, NIGDY nie używaj konkatenacji ciągów w Pythonie (+) lub interpolacja parametrów struny (%) do przekazywania zmiennych do ciągu zapytania SQL. Nawet przy broni palnej. "Oprócz ataków SQL injection, drugą korzyścią jest to, że sterownik" potrafi automatycznie konwertować obiekty Pythona do iz literałów SQL: używając tej funkcji twój kod będzie bardziej niezawodny i niezawodny ". podejście do składu łańcuchów zapytań, np przy użyciu konkatenacji ciągów znaków. " –