Frage

Ich versuche, die folgende SQL-Anweisung Pythons db-api zu montieren:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

wo BEGINNING_OF_STRING sollte eine Python var sicher in dem durch das DB-API gefüllt werden. Ich habe versucht,

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

Ich bin aus Ideen; Was ist der richtige Weg, um dies?

zu tun
War es hilfreich?

Lösung

Am besten ist es, die Parameter aus der SQL zu trennen, wenn Sie können. Dann können Sie das DB-Modul kümmern sich um die richtige lassen der Parameter zitieren.

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)

Andere Tipps

EDIT:

Als Brian und Thomas erwähnten, ist der weit bessere Weg, dies zu tun wäre, zu verwenden:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

, da die erste Methode Blätter öffnen Sie SQL-Injection-Angriffe.


links in für Geschichte:

Versuchen Sie:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)

Beachten Sie Sqlite3 Dokumentation:

  

wird normalerweise Ihre SQL-Operationen benötigen   Werte von Python-Variablen zu verwenden.   Sie sollten Ihre Abfrage nicht zusammenbauen   Verwendung von Python-String-Operationen   weil so tun, ist unsicher; es macht   Ihr Programm anfällig für einen SQL   Injection-Angriff.

     

Verwenden Sie stattdessen die DB-API-Parameter   Auswechslung. Stellen ? als Platzhalter   wo wollen Sie einen Wert verwenden, und   liefert dann ein Tupel von Werten als die   zweites Argument der Cursor   execute () Methode. (Andere Datenbank   Module können eine andere verwenden   Platzhalter, wie% s oder:. 1)   Beispiel:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

Ich glaube, Sie wollen diese:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top