Psycopg2 – Insertar diccionario como JSON

En este artículo vamos a ver cómo insertar un diccionario como JSON usando Psycopg2 y Python.

Los objetos dict de Python pueden o deben almacenarse en tablas de bases de datos como tipo de datos JSON. Dado que la mayoría de las bases de datos SQL tienen un tipo de datos JSON. Esto permite usar estos objetos o pares clave-valor en el front-end o en una API para procesar la solicitud que se realiza desde ellos, respectivamente.

Configuración de una base de datos y una tabla de PostgreSQL:

Vamos a crear un esquema en PostgreSQL y agregarle una tabla con al menos una columna de tipo JSON. Podemos usar el siguiente script SQL para crear el mismo.

En el script SQL anterior, hemos creado un nombre de esquema «geeks». Se crea una tabla «json_example» en el esquema que consta de dos columnas, una que es la clave principal tiene el nombre de columna «id», mientras que la otra columna tiene el nombre «json_col», que es de tipo JSON.

Insertar un objeto dict de python en la tabla PostgreSQL usando la biblioteca psycopg2:

Python

import json
import psycopg2
  
# SAVE THE DB CONFIG IN A DICT OBJECT
DATABASE_CONFIG = {
    "database": "geeks",
    "user": "postgres",
    "password": "password",
    "host": "localhost",
    "port":  5432,
}
  
  
def get_connection():
  
    # RETURN THE CONNECTION OBJECT
    return psycopg2.connect(
        database=DATABASE_CONFIG.get('database'),
        user=DATABASE_CONFIG.get('user'),
        password=DATABASE_CONFIG.get('password'),
        host=DATABASE_CONFIG.get('host'),
        port=DATABASE_CONFIG.get('port'),
    )
  
  
def dict_to_json(value: dict):
  
    # CONVERT DICT TO A JSON STRING AND RETURN
    return json.dumps(value)
  
  
def insert_value(id: str, json_col: str, conn):
  
    # CREATE A CURSOR USING THE CONNECTION OBJECT
    curr = conn.cursor()
  
    # EXECUTE THE INSERT QUERY
    curr.execute(f'''
        INSERT INTO
            json_table(id, json_col) 
        VALUES
            ('JSON001', '{json_col}')
    ''')
  
    # COMMIT THE ABOVE REQUESTS
    conn.commit()
  
    # CLOSE THE CONNECTION
    conn.close()
  
  
def main():
  
    # CREATE A PSYCOPG2 CONNECTION
    conn = get_connection()
  
    # CREATE A PYTHON DICT OBJECT FOR JSON COL
    dict_obj = {
        "name": "Amit Pathak",
        "skill": "Python",
        "experience": 4
    }
  
    # CONVERT DICT OBJECT TO JSON STRING
    json_obj = dict_to_json(value=dict_obj)
  
    # INSERT VALUES IN THE DATABASE TABLE
    insert_value(id='JSON001', json_col=json_obj,
                 conn=conn)
  
if __name__ == '__main__':
    main()

Después de ejecutar el archivo python anterior, podemos dirigirnos a pgAdmin para ver el siguiente resultado en la tabla json_table bajo el esquema público. Puede ejecutar el siguiente script SQL en la herramienta de consulta:

$ SELECT * FROM json_table;

Salida vista en pgAdmin

Explicación:

El código anterior está escrito en un formato funcional para una mejor representación de los pasos subyacentes que tienen lugar en todo el proceso. La función get_connection() devuelve el objeto de conexión a la tabla de PostgreSQL mediante el cual podemos establecer una conexión a la base de datos para nuestras operaciones. Si no se puede establecer el objeto de conexión, devolverá False . Ahora, tenemos un objeto dict de python creado con el nombre de variable dict_obj . Insertaremos este objeto dict en la base de datos. Pero, antes de insertar este objeto dict, necesitamos convertir el objeto en formato JSON ya que la base de datos entiende el formato JSON y no el objeto dict python. Módulo json incorporado de Pythonse usa para convertir el objeto dict en un formato de string JSON usando el método dumps() . Ahora que tenemos la string JSON y el objeto de conexión, podemos insertar los datos en la tabla de la base de datos json_table . Para este propósito, hemos creado una función llamada insert_value() que toma 3 argumentos, a saber, id para el valor que se insertará en la columna id, json_col para el valor que se debe insertar en la columna json_col y el parámetro conn por proporcionar el objeto de conexión creado anteriormente. Podemos ver que la función insert_value() ejecuta el INSERT habitualScript SQL usando el objeto de conexión. La conexión se cierra una vez que los datos se insertan en la tabla.

Usando la adaptación psycopg2 Json

El siguiente código demuestra cómo se puede usar la adaptación Json de psycopg2 en lugar del json.dumps() estándar . Para pasar un objeto de Python a la base de datos como argumento de consulta, puede usar el adaptador Json importado de psycopg2.extras .

Python

import psycopg2
from psycopg2.extras import Json
  
  
# CREATE A PSYCOPG2 CONNECTION
conn = psycopg2.connect(**{
    "database" : "geeks",
    "user"     : "postgres",
    "password" : "password",
    "host"     : "localhost",
    "port"     :  5432,
})
  
# CREATE DICT OBJECT TO BE INSERTED TO DB
dict_obj = {
    "name": "Suhas Hegde",
    "skill": "PL/SQL",
    "experience": 3
}
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE INSERT QUERY
curr.execute(f'''
    INSERT INTO
        json_table(id, json_col) 
    VALUES
        ('JSON002', %s)
''', [Json(dict_obj)])
  
# COMMIT THE REQUESTS IN QUEUE
conn.commit()
  
# CLOSE THE CONNECTION
conn.close()

Producción:

Salida vista en pgAdmin

En el código anterior, estamos tratando de insertar una nueva entrada JSON con id como JSON002 . Todo el proceso sigue siendo el mismo que en el código anterior, excepto por el hecho de que hemos usado psycopg2.extras.Json en lugar de json.dumps .

Publicación traducida automáticamente

Artículo escrito por apathak092 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *