es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Substitución de parámetros con nombre de Python en una ruta JSON en una consulta SQLite?

Estoy tratando de sustituir una parte de una ruta JSON con una variable de Python en una consulta de selección SQLite que incluye una función de extracción JSON. La consulta funciona si no uso la sustitución:

c.execute("insert into rd_test values (?, ?)",
                ["test_record", json.dumps(k[0]["data"]["children"][0])])

sample_query = c.execute('select json_extract(data, \'$.data.title\') from rd_test;').fetchall()
print(sample_query)

Esto devuelve correctamente [('sample_title',)]. Sin embargo, como tengo que trabajar con muchos registros JSON diferentes que están todos en el mismo nivel de ruta en el archivo JSON, me gustaría crear una función en la que solo tenga que ingresar la parte de la ruta que es diferente.

Me gustaría usar el estilo con nombre para la sustitución:

sample_query = c.execute('select json_extract(data, \'$.data.:var1\') from rd_test;', {"var1": 'title'}).fetchall()
print(sample_query)

Esto devuelve [(None,)]. ¿Dónde está mi error?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error en la segunda consulta es que SQLite no admite la sustitución de parámetros con nombre utilizando dos puntos (“:”). En su lugar, debes utilizar signos de interrogación (“?”) como marcadores de posición y pasar los valores como una tupla a la función execute. El código correcto sería:

    sample_query = c.execute('''select json_extract(data, ?) from rd_test''', ('$.data.' + var1,))
    

    Aquí, concatenamos la ruta JSON con la variable utilizando el operador “+” y lo pasamos como una tupla con un solo elemento a la función execute. Esto debería devolver el resultado deseado.

Comments are closed.