what science for espaƱol doing datos data ciencia python mysql

science - python for data analysis



Python MySQL Parameterized Queries (6)

Aquí hay otra manera de hacerlo. Está documentado en el sitio web oficial de MySQL. https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

En el espíritu, está usando la misma mecánica de la respuesta de @Trey Stout. Sin embargo, me parece más bonita 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:

NB: fíjese que el escape está hecho.

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)

Me está costando usar 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) """)

¿Puede alguien ayudarme con la sintaxis aquí?


Como alternativa a la respuesta elegida, y con la misma semántica segura de Marcel''s, aquí hay una forma compacta de usar un diccionario de Python para especificar los valores. Tiene la ventaja de ser fácil de modificar a medida que agrega o quita columnas para 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 que contiene los valores para 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()


De hecho, incluso si su variable (SongLength) es numérica, igual tendrá que formatearla con% s para vincular el parámetro correctamente. Si intenta usar% d, obtendrá un error. Aquí hay un pequeño extracto de este enlace http://mysql-python.sourceforge.net/MySQLdb.html :

Para realizar una consulta, primero necesita un cursor y luego 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, usa% s en la cadena? Porque MySQLdb lo convertirá a un valor literal de SQL, que es la cadena ''5''. Cuando haya terminado, la consulta realmente dirá: "... DONDE precio <5".


Los documentos vinculados dan el siguiente ejemplo:

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

Entonces solo necesitas adaptar esto a tu propio código, por 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, es posible que necesite usar% d en lugar de% s).


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

Incorrecto (con problemas de seguridad)

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

Correcto (con escape)

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

Se agrega a la confusión que los modificadores utilizados para vincular parámetros en una instrucción SQL varía entre las distintas implementaciones de DB API y que la biblioteca del cliente mysql utiliza la sintaxis de estilo de impresión en lugar de la más aceptada ''?'' marcador (utilizado por, por ejemplo, python-sqlite ).


Tienes algunas opciones disponibles. Querrá sentirse cómodo con la iterpolación de cadenas de Python. ¿Cuál es un término que podría tener más éxito buscando en el futuro cuando quiera saber cosas como esta?

Mejor para 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 que probablemente ya tenga todos sus datos en un objeto o diccionario, el segundo formato le conviene más. También es una mierda tener que contar las apariencias de "% s" en una cadena cuando tienes que volver y actualizar este método en un año :)