Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

491
Views
¿Cómo puedo hacer que una base de datos MySQL inserte un valor predeterminado si hay un intento de insertar un valor nulo con Python?

He leído respuestas que hacen algo similar pero no exactamente lo que estoy buscando, que es: intentar insertar una fila con un valor NULL en una columna dará como resultado que se inserte el valor DEFAULT de esa columna.

Estoy tratando de procesar una gran cantidad de inserciones en el conector mySQL Python con una gran cantidad de valores de columna que no quiero tratar individualmente, y ninguna de las alternativas típicas funciona aquí. Aquí hay un boceto de mi código:

 qry = "INSERT INTO table (col1, col2, ...) VALUES (%s, %s, ...)" row_data_dict = defaultdict(lambda : None, {...}) params = [] for col in [col1, col2, ...]: params.append(row_data_dict[col]) cursor.execute(qry, tuple(params))

Mi problema principal es que configurar None como predeterminado en el diccionario da como resultado que se inserte NULL o un error si especifico la fila como NOT NULL . Tengo una gran cantidad de columnas que podrían cambiar en el futuro, por lo que me gustaría evitar establecer diferentes valores 'predeterminados' para diferentes entradas si es posible.

No puedo hacer la forma típica de insertar DEFAULT omitiendo columnas en el inserto porque si bien esas columnas pueden tener el valor DEFAULT , no puedo garantizarlo y, considerando que estoy haciendo una gran cantidad de inserciones, no quiero para cambiar la cadena de consulta cada vez que inserto dependiendo de si es predeterminado o no.

La otra forma de insertar DEFAULT parece ser tener DEFAULT como uno de los parámetros (por ejemplo, INSERT INTO table (col1,...) VALUES (DEFAULT,...) ) pero en mi caso establecer el valor predeterminado en el diccionario en 'DEFAULT' da como resultado un error (mySQL se queja de que es un valor entero incorrecto al intentar insertarlo en una columna de enteros, lo que hace que parezca que está interpretando el valor predeterminado como una cadena y no como una palabra clave).

Parece que sería un caso de uso relativamente común, por lo que me sorprende que no pueda encontrar una manera de hacerlo. Apreciaría cualquier forma de hacer esto o solucionarlo que no haya enumerado aquí.

EDITAR: todas las columnas relevantes ya están etiquetadas con un valor DEFAULT , no parece reemplazar NULL (o python's None ) cuando se inserta.

EDIT 2: La razón por la que quiero evitar NULL tanto es porque NULL != NULL y quiero tener filas únicas, de modo que si hay una fila (1, 2, 3, 'Desconocido'), INSERT IGNORE'ing a fila (1, 2, 3, 'Desconocido') no lo insertará. Con NULL terminas con un montón de copias del mismo registro porque uno de los valores es desconocido.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Puede usar la función DEFAULT() en la lista VALUES para especificar que se debe usar el valor predeterminado para la columna. Y puede poner esto en una llamada IFNULL() para que se use cuando el valor proporcionado sea NULL .

 qry = """INSERT INTO table (col1, col2, ...) VALUES (IFNULL(%s, DEFAULT(col1)), IFNULL(%s, DEFAULT(col2)), ...)"""
over 4 years ago · Santiago Trujillo Report

0

Bienvenido a Stackoverflow. Lo que debe hacer es agregar un valor predeterminado en su base de datos para la columna que desea que tenga el valor predeterminado. Cuando cree su tabla, simplemente use DEFAULT y luego el valor después de crear la columna en la tabla, así:

 CREATE TABLE `yourTable` (`id` INT DEFAULT 0, .....)

si ya ha creado la tabla y necesita modificar la columna existente, haría algo como esto:

 ALTER TABLE `yourTable` MODIFY `id` INT DEFAULT 0

entonces, en su declaración de inserción proveniente de python, siempre que pase NULL o Nothing para el valor de esa columna, cuando la fila se inserte en su base de datos, el valor predeterminado se completará para esa columna

Otra cosa a tener en cuenta es que debe pasar la cantidad adecuada de valores cuando tiene una configuración predeterminada para una columna. Digamos que tiene una tabla con 3 columnas, las llamaremos colA , colB y colC . si desea insertar una fila con colA_value para colA , nada para colB , por lo que usará su valor predeterminado y colC_value para colC , entonces aún debe pasar 3 valores que se usarán para su inserción. Si acaba de pasar colA_value y colC_value , entonces colA obtendrá colA_value y colB obtendrá colC_value y colC será null . necesita pasar valores que serán interpretados por MySQL así:

 INSERT INTO `yourTable` (`colA`, `colB`, `colC`) VALUES ('colA_value', null, 'colC_value')

a pesar de que no está pasando nada para colB , necesita pasar un valor null de su programa python pasando null o None a MySQL para el valor de colB para que colB se complete con su valor predeterminado

si solo pasa 2 valores a MySQL para insertar una fila en su tabla, la declaración de inserción debajo del capó se verá así:

 INSERT INTO `yourTable` (`colA`, `colB`, `colC`) VALUES ('colA_value', 'colC_value')

lo que daría como resultado que colA se establezca en colA_value , colB se establezca en colC_value y colC se deje como null

si está pasando el número correcto de valores para insertar en MySQL (eso significaría que necesita incluir null o None para que el valor se inserte en la columna con el valor predeterminado), esa es otra historia. Avíseme si está pasando la cantidad correcta de valores para que pueda ayudarlo a solucionar más problemas si es necesario.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!