suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Verschachteln einer Liste innerhalb der IN-Klausel in Python MySQL

<p>Ich weiß, wie man eine Liste einer Zeichenfolge zuordnet: </p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>Ich weiß, dass ich diese Zeichenfolge mit folgendem Befehl in eine IN-Klausel einfügen kann: </p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>Ich muss die gleiche Funktionalität auf sichere Weise in einer MySQL-Datenbank implementieren (ohne SQL-Injection). Da der Footstring im obigen Beispiel nicht als Parameter zur Ausführung übergeben wird, ist er anfällig. Ich muss auch außerhalb der MySQL-Bibliothek zitieren und maskieren. </p> <p> (Es gibt eine verwandte SO-Frage, aber die dort aufgeführten Antworten funktionieren entweder nicht mit MySQL-Datenbanken oder sind anfällig für SQL-Injection-Angriffe.) </p>
P粉781235689P粉781235689520 Tage vor530

Antworte allen(2)Ich werde antworten

  • P粉434996845

    P粉4349968452023-08-23 15:50:40

    虽然这个问题很旧,但我想留下回复,以防其他人也在寻找我想要的东西

    当我们有很多参数或者想要使用命名参数时,接受的答案会变得混乱

    经过一些尝试

    ids = [5, 3, ...]  # id列表
    cursor.execute('''
    SELECT 
    ...
    WHERE
      id IN %(ids)s
      AND created_at > %(start_dt)s
    ''', {
      'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
    })
    

    python2.7pymysql==0.7.11下测试通过

    Antwort
    0
  • P粉212114661

    P粉2121146612023-08-23 00:26:09

    直接使用list_of_ids

    format_strings = ','.join(['%s'] * len(list_of_ids))
    cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                    tuple(list_of_ids))

    这样可以避免自己引用,也避免了各种SQL注入问题。

    请注意,数据(list_of_ids)直接传递给mysql的驱动程序作为参数(而不是在查询文本中),因此没有注入问题。您可以在字符串中保留任何字符,无需删除或引用字符。

    Antwort
    0
  • StornierenAntwort