Frage

Es fällt mir schwer, das MySQLdb-Modul zum Einfügen von Informationen in meine Datenbank zu verwenden.Ich muss 6 Variablen in die Tabelle einfügen.

cursor.execute ("""
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
    VALUES
        (var1, var2, var3, var4, var5, var6)

""")

Kann mir hier jemand bei der Syntax helfen?

War es hilfreich?

Lösung

Beware von String-Interpolation für SQL-Abfragen verwendet wird, da es nicht die Eingabeparameter richtig entweichen und wird Ihre Anwendung auf SQL-Injection-Schwachstellen offen lassen. Der Unterschied mag trivial, aber es ist riesig in der Realität.

Falsch (mit Sicherheitsfragen)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))

Correct (mit Flucht)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

Sie fügt hinzu, um die Verwirrung, dass die Modifikatoren zu binden Parameter in einer SQL-Anweisung variieren zwischen verschiedenen DB-API-Implementierungen und dass die MySQL-Client-Bibliothek verwendet printf Stil Syntax anstelle der allgemein akzeptierten verwendet ‚?‘ Marker (verwendet von zB. python-sqlite).

Andere Tipps

Sie haben ein paar Optionen zur Verfügung. Sie werden mit Python-String iterpolation bequem machen möchten. Was ein Begriff ist, dass Sie vielleicht mehr Erfolg für die Zukunft suchen, wenn Sie Sachen wie diese wissen wollen.

Besser für Rückfragen:

some_dictionary_with_the_data = {
    'name': 'awesome song',
    'artist': 'some band',
    etc...
}
cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

        """, some_dictionary_with_the_data)

In Anbetracht Sie wahrscheinlich alle Ihre Daten in einem Objekt oder Wörterbuch bereits, wird das zweite Format, das Sie besser passen. Auch saugt, es zu haben „% s“ Auftritte in einer Zeichenfolge zu zählen, wenn Sie kommen müssen zurück und aktualisieren Sie diese Methode in einem Jahr:)

Die verknüpften Dokumente geben Sie das folgende Beispiel:

   cursor.execute ("""
         UPDATE animal SET name = %s
         WHERE name = %s
       """, ("snake", "turtle"))
   print "Number of rows updated: %d" % cursor.rowcount

So einfach diese zu Ihrem eigenen Code anpassen müssen - Beispiel:

cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%s, %s, %s, %s, %s, %s)

        """, (var1, var2, var3, var4, var5, var6))

(Wenn SongLength numerisch ist, können Sie% d müssen, anstatt% s verwenden).

Eigentlich, auch wenn Ihre Variable (SongLength) numerisch ist, werden Sie noch formatieren müssen, um mit% s, um die Parameter richtig zu binden. Wenn Sie versuchen,% d zu verwenden, wird eine Fehlermeldung angezeigt. Hier ist ein kleiner Auszug aus diesem Link http://mysql-python.sourceforge.net/MySQLdb.html

eine Abfrage auszuführen, müssen Sie zuerst einen Cursor benötigen, und dann können Sie Abfragen auf es ausführen:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

In diesem Beispiel MAX_PRICE = 5 Warum also verwenden% s in der Zeichenfolge? Da MySQLdb wird es zu einem SQL wörtlichen Wert konvertieren, das ist die Zeichenfolge ‚5‘. Wenn es fertig ist, wird die Abfrage tatsächlich sagen:“... WHERE Preis <5" .

Als Alternative zur gewählten Antwort und mit der gleichen sicheren Semantik wie bei Marcel finden Sie hier eine kompakte Möglichkeit, ein Python-Wörterbuch zur Angabe der Werte zu verwenden.Es hat den Vorteil, dass es leicht geändert werden kann, wenn Sie einzufügende Spalten hinzufügen oder entfernen:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  insert='insert into Songs ({0}) values ({1})'.
        .format(','.join(meta_cols), ','.join( ['%s']*len(meta_cols) ))
  args = [ meta[i] for i in meta_cols ]
  cursor=db.cursor()
  cursor.execute(insert,args)
  db.commit()

Wo Meta ist das Wörterbuch, das die einzufügenden Werte enthält.Das Update kann auf die gleiche Weise erfolgen:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  update='update Songs set {0} where id=%s'.
        .format(','.join([ '{0}=%s'.format(c) for c in meta_cols ]))
  args = [ meta[i] for i in meta_cols ]
  args.append( songid )
  cursor=db.cursor()
  cursor.execute(update,args)
  db.commit()

Hier ist eine andere Art und Weise, es zu tun. Es ist auf der MySQL offizielle Website dokumentiert. https: //dev.mysql. com / doc / Stecker-python / en / Stecker-python-api-mysqlcursor-execute.html

Im Geist, wird es mit dem gleichen Mechaniker von @Trey Stout Antwort. Allerdings finde ich, das eine schöne und besser lesbar.

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

Und besser keine Notwendigkeit für Variablen zu verdeutlichen:

. NB: Achten Sie auf die Flucht gemacht werden

employee_id = 2
first_name = "Jane"
last_name = "Doe"

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (employee_id, conn.escape_string(first_name), conn.escape_string(last_name), datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

Die erste Lösung funktioniert gut. Ich möchte hier ein kleines Detail hinzuzufügen. Stellen Sie sicher, dass die Variable, die Sie ersetzen wollen / aktualisieren, es wird eine Art str sein muss. Mein MySQL-Typ ist dezimal, aber ich hatte den Parameter variabel zu machen als str der Lage sein, um die Abfrage auszuführen.

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top