Question

Je vais avoir un moment difficile de l'utiliser le module MySQLdb d'insérer les informations dans ma base de données.J'ai besoin d'insérer 6 variables dans la table.

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

""")

Quelqu'un peut m'aider avec la syntaxe ici?

Était-ce utile?

La solution

Méfiez-vous d'utiliser l'interpolation de chaîne pour les requêtes SQL, car il n'échappera pas correctement les paramètres d'entrée et laisser votre application ouverte aux vulnérabilités d'injection SQL. La différence peut sembler trivial, mais en réalité, il est énorme .

incorrecte (avec les problèmes de sécurité)

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

Correct (à l'évacuation)

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

Il ajoute à la confusion que les modificateurs utilisés pour lier des paramètres dans une instruction SQL varie entre les différentes implémentations de l'API DB et que la bibliothèque client MySQL utilise la syntaxe de style printf au lieu de plus communément admise »? marqueur (utilisé par exemple. python-sqlite).

Autres conseils

Vous avez quelques options disponibles. Vous aurez envie de se familiariser avec la iterpolation chaîne de python. Ce qui est un terme que vous pourriez avoir plus de succès pour la recherche dans l'avenir quand vous voulez savoir des choses comme cela.

Mieux pour les requêtes:

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)

Étant donné que vous avez probablement toutes vos données dans un objet ou un dictionnaire déjà, le second format vous convient mieux. il aspire aussi devoir compter des apparitions « de% s » dans une chaîne quand vous devez revenir et mettre à jour cette méthode en un an:)

Les documents liés donnent l'exemple suivant:

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

Vous avez juste besoin d'adapter ce à votre propre code - exemple:

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

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

(Si SongLength est numérique, vous devrez peut-être utiliser% d au lieu de% s).

En fait, même si votre variable (SongLength) est numérique, vous devez toujours formater avec% s pour lier le paramètre correctement. Si vous essayez d'utiliser% d, vous obtiendrez une erreur. Voici un petit extrait de ce lien http://mysql-python.sourceforge.net/MySQLdb.html :

Pour effectuer une requête, vous devez d'abord un curseur, et vous pouvez exécuter des requêtes sur elle:

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

Dans cet exemple, max_price = 5 Pourquoi, alors, utilisez% s dans la chaîne? Parce que MySQLdb se convertir à une valeur littérale SQL, qui est la chaîne « 5 ». Une fois terminé, la requête fait dire, » ... où le prix <5" .

Comme une alternative à la réponse choisie, et avec la même sécurité et la sémantique de Marcel, ici, c'est une manière compacte de l'aide d'un dictionnaire Python pour spécifier les valeurs.Il a l'avantage d'être facile à modifier que vous ajoutez ou supprimez des colonnes à insérer:

  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()

meta est le dictionnaire de portefeuille les valeurs à insérer.Mise à jour peut être effectuée de la même manière:

  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()

Voici une autre façon de le faire. Il est documenté sur le site officiel de MySQL. https: //dev.mysql. com / doc / connecteur python / fr / connecteur python-api-mysqlcursor-execute.html

Dans l'esprit, il utilise le même mécanicien de la réponse de @Trey Stout. Cependant, je trouve cela un plus joli et plus lisible.

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)

Et pour mieux illustrer tous les besoins des variables:

NB:. L'évasion étant note Remarque fait

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)

La première solution fonctionne bien. Je veux ajouter un petit détail ici. Assurez-vous que la variable que vous essayez de remplacer / mettre à jour sera doit être un type str. Mon type MySQL est décimal, mais je devais faire la variable de paramètre comme str pour être en mesure d'exécuter la requête.

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top