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.

No se puede insertar datos extraídos de una API en la base de datos de SQL Server.

Estoy intentando extraer datos JSON de Python recuperados a través de una API que requiere un token de acceso en una base de datos de SQL Server.

El formato de la tabla es el siguiente:

[dbo].[Productos](
[NombreProducto] [varchar](50) NULL,
[DescripcionProducto] [varchar](50) NULL,
[CantidadProducto] [int] NULL
)

Puedo acceder a los datos de la API utilizando la siguiente consulta:

import requests

TOKEN = Token_key

BASE_URL = '[url]'

HEADERS = {
   'Authorization': TOKEN
}

data = {
   "query" : {
      "dimensions": [
         "NombreProducto",
         "DescripcionProducto"
      ],
      "measures": [
         "CantidadProducto"
      ]
   }
}

response = requests.get('[url]', headers=HEADERS, json=data)

print(response.json())

Estoy intentando insertar los valores de las dimensiones y medidas recibidas de la API en la tabla de arriba, que se encuentra en una base de datos de SQL Server 2016, utilizando pyodbc de la siguiente manera:

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};'
                     'Server=NombreDelServidor;'
                     'Database=NombreBaseDeDatos;'
                     'Trusted_Connection=yes;')

cursor = conn.cursor()

SQLCommand = ("INSERT INTO [NombreTabla] "
              "(NombreProducto, DescripcionProducto, CantidadProducto) "
              "VALUES (?,?,?);")

Values = ['$.NombreProducto', '$.DescripcionProducto', '$.CantidadProducto']

cursor.execute(SQLCommand, Values)

conn.commit()

El comando INSERT solo está insertando el texto “$.NombreProducto”, “$.DescripcionProducto” y “$.CantidadProducto” en la tabla, pero me gustaría insertar los valores recuperados.

La respuesta podría ser similar a la que se encuentra en https://stackoverflow.com/questions/55613955/issue-with-inserting-data-into-sql-server-using-python-pandas-dataframe, pero esto es un POST en lugar de un GET y está limitado por mis conocimientos de Python.

Apreciaría mucho tu ayuda.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para insertar los valores reales recuperados de la API en la tabla, debes modificar la variable “Values”. En lugar de usar la representación de cadena de las claves JSON, debes extraer los valores reales del objeto “response.json()” y asignarlos a la lista “Values”.

    Aquí te muestro cómo puedes modificar el código:

    import pyodbc
    import requests
    
    TOKEN = Token_key
    BASE_URL = '[url]'
    HEADERS = {
        'Authorization': TOKEN
    }
    data = {
        "query" : {
            "dimensions" : [
                "ProductName",
                "ProductDesc"
            ],
            "measures" : [
                "ProductAmount"
            ]
        }
    }
    response = requests.get(BASE_URL, headers=HEADERS, json=data)
    
    conn = pyodbc.connect('Driver={SQL Server};Server=NombreDelServidor;Database=NombreDeLaBaseDeDatos;Trusted_Connection=yes;')
    cursor = conn.cursor()
    
    SQLCommand = "INSERT INTO [dbo].[Products] (ProductName, ProductDesc, ProductAmount) VALUES (?, ?, ?);"
    
    for result in response.json().get('results'):
        Values = [result.get('ProductName'), result.get('ProductDesc'), result.get('ProductAmount')]
        cursor.execute(SQLCommand, Values)
    
    conn.commit()
    

    En este código modificado, iteramos sobre el objeto “response.json().get(‘results’)” que contiene los valores reales de las dimensiones y medidas recuperados de la API. Luego asignamos estos valores a la lista “Values” y ejecutamos el comando SQL para cada resultado usando el método “cursor.execute()”.

    Nota que también modifiqué la instrucción INSERT para insertar los valores en la tabla “dbo.Products” en lugar de la tabla no especificada “Tablename” en tu código original.

    Espero que esto ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.