2011-11-29 40 views
6

Quiero insertar una lista en mi base de datos pero no puedo.Insertar lista en mi base de datos usando Python

Aquí es un ejemplo de lo que necesito:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
list = [variable_1,variable_2] 

INSERT INTO table VALUES ('%s') % list 

¿Puede algo como esto puede hacer? ¿Puedo insertar una lista como valor? Cuando lo intento, aparece un error que se debe a un error en la sintaxis de MySQL

+2

En general, si usted tiene un mensaje de error, debe incluirlo en la pregunta. –

+0

¿por qué no utilizar el módulo redis? If use ast y redis-py, puede escribir una lista en redis.eg.r.set (a, [1,23,3]). Cuando necesite este objeto, puede usar b = ast.literal_eval (r.get (a)) para obtener la lista –

Respuesta

12

La respuesta a su pregunta original es: No, no puede insertar una lista como esa.

Sin embargo, con algunas modificaciones, podría hacer que el trabajo de código mediante el uso de %r y pasando en una tupla:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1, variable_2] 
print "INSERT INTO table VALUES %r;" % (tuple(varlist),) 

Por desgracia, ese estilo de inserción de la variable sale de su código vulnerable a SQL injection attacks.

lugar, se recomienda el uso de Python's DB API y la construcción de una cadena de consulta personalizada con múltiples signos de interrogación de los datos que se insertan:

variable_1 = "HELLO" 
variable_2 = "ADIOS" 
varlist = [variable_1,variable_2] 
var_string = ', '.join('?' * len(varlist)) 
query_string = 'INSERT INTO table VALUES (%s);' % var_string 
cursor.execute(query_string, varlist) 

El ejemplo al comienzo de la SQLite3 docs muestra cómo pasar argumentos usando la pregunta marca y explica por qué son necesarios (esencialmente, asegura la correcta cotización de sus variables).

4

Tu pregunta no está clara.

¿Desea insertar la lista como una cadena de texto delimitada por comas en una sola columna en la base de datos? ¿O desea insertar cada elemento en una columna separada? Cualquiera de los dos es posible, pero la técnica es diferente.

Insertar lista separada por comas en una columna:

conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)]) 

insertar en columnas separadas:

params = ['?' for item in list] 
    sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) 
    conn.execute(sql, list) 

tanto suponiendo que haya establecido un nombre de conexión conn.

A otros algunas sugerencias:

  • tratar de evitar declaraciones INSERT que no presenten un listado de los nombres y el orden de las columnas que está insertando en. Ese tipo de declaración conduce a un código muy frágil; se rompe si agrega, elimina o mueve columnas en su tabla.

  • Si está insertando una lista separada por separted en un solo campo, en general, que viole principios del diseño de base de datos y se debe utilizar una tabla separada con un valor por cada registro.

  • Si está insertando en campos separados y tienen nombres como Word1 y Word2, también es una indicación de que debe usar una tabla separada.

  • Nunca use la sustitución directa de cadenas para crear instrucciones SQL. Se romperá si uno de los valores es, por ejemplo, o'clock. También lo abre a ataques de personas que usan técnicas de inyección SQL.

+0

HI Larry .... Quiero insertar dos cadenas diferentes en la misma columna ... así que cuando hago la consulta para obtener lo que está adentro esa columna ... Sé que hay dos cadenas diferentes ... es por eso que estoy tratando de insertar el valor como una lista – mauguerra

+1

No puedes hacer eso. Una columna puede contener solo una cadena. Puedes tener una coma en esa cadena para que parezca dos cadenas diferentes, pero obviamente eso no funciona si una de las cadenas * ya * tiene una coma. Pero debe buscar la idea de la normalización de la base de datos y rediseñar su base de datos para usar una tabla separada y relacionada para contener estos valores. Nunca, jamás, ponga más de un valor en una columna de base de datos. –

1

Puede utilizar json.dumps para convertir una lista de JSON y escribir el JSON a db.

Por ejemplo:

insert table example_table(column_name) values(json.dumps(your_list)) 
+0

Este ejemplo es muy confuso. No puede usar una función de Python como 'json.dumps' desde dentro de su cadena SQL. Tendría que llamar 'json.dumps' primero, luego usar uno de los métodos de sustitución de parámetros sugeridos en otras respuestas para pasar la cadena JSON resultante como un parámetro. Tampoco suele ser una buena idea almacenar cadenas JSON en una columna de base de datos. – tsleyson

Cuestiones relacionadas