Pregunta

Estoy teniendo un tiempo duro con el módulo MySQLdb para insertar información en mi base de datos.Necesito insertar 6 variables en la tabla.

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

""")

Alguien me puede ayudar con la sintaxis de aquí?

¿Fue útil?

Solución

Tenga cuidado de usar la interpolación de cadenas para las consultas SQL, ya que no escapará a los parámetros de entrada correcta y dejará su aplicación abierta a vulnerabilidades de inyección SQL. La diferencia puede parecer trivial, pero en realidad es enorme .

incorrecta (con problemas de seguridad)

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

correcta (con escape)

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

Se suma a la confusión que los modificadores utilizados para enlazar parámetros en una declaración SQL varía entre las distintas aplicaciones de la API de DB y que la biblioteca de cliente MySQL usa sintaxis de estilo printf en lugar de la más comúnmente aceptada '?' marcador (utilizado por ejemplo. python-sqlite).

Otros consejos

Usted tiene algunas opciones disponibles. Usted querrá sentirse cómodo con iterpolation cadenas de Python. Que es un término que pueda tener más éxito la búsqueda de en el futuro cuando usted quiere saber cosas como esta.

Una mejor para las consultas:

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)

Teniendo en cuenta es probable que tenga todos sus datos en un objeto o un diccionario ya, el segundo formato le conviene mejor. También aspira a tener que contar "% s" apariciones en una cadena cuando se tiene que volver y actualizar este método en un año:)

Los docs enlaces dan el siguiente ejemplo:

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

Por lo que sólo necesita adaptar esto a su propio código - ejemplo:

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 es numérico, puede que tenga que usar% d en lugar de% s).

En realidad, incluso si la variable (SongLength) es numérico, todavía se tiene que formatear con% s con el fin de enlazar el parámetro correctamente. Si intenta utilizar% d, obtendrá un error. He aquí un pequeño extracto de este enlace http://mysql-python.sourceforge.net/MySQLdb.html :

Para realizar una consulta, es necesario en primer lugar un cursor, y luego se puede ejecutar consultas en él:

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

En este ejemplo, MAX_PRICE = 5 ¿Por qué, entonces, usar% s en la cadena? Debido MySQLdb lo convertirá a un valor literal de SQL, que es la cadena '5'. Cuando esté terminado, la consulta va a decir en realidad," ... donde el precio <5" .

Como una alternativa a la respuesta que elijas, y con el mismo seguro semántica de Marcel, aquí es una forma compacta de la utilización de un diccionario de Python para especificar los valores.Tiene la ventaja de ser fácil de modificar, agregar o quitar columnas a insertar:

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

Donde meta es el diccionario de la celebración de los valores a insertar.La actualización se puede hacer de la misma manera:

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

Aquí hay otra manera de hacerlo. Está documentado en la página oficial de MySQL. https: //dev.mysql. com / doc / conector-python / es / conector-python-api-mysqlcursor-execute.html

En el espíritu, se trata de utilizar la misma mecánica de la respuesta de @Trey Stout. Sin embargo, creo que este uno más bonito y más legible.

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)

Y para ilustrar mejor cualquier necesidad de variables:

Nota:. Tenga en cuenta la fuga está haciendo

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 primera solución funciona bien. Quiero añadir un pequeño detalle aquí. Asegúrese de que la variable que se está tratando de reemplazar / actualizarlo se tiene que ser un tipo str. Mi tipo MySQL es decimal, pero tenía que hacer que la variable str parámetro como para ser capaz de ejecutar la consulta.

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top