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.

Error al escribir los parámetros en la tabla SQL con Pyodbc.

Estoy tratando de escribir en mi tabla SQL que contiene los parámetros “time, camID, id, x, y, height”, con la siguiente función:

database_connection = pyodbc.connect('Trusted_Connection=yes', driver='{SQL Server}',
                      server=server, database=database, UID=user, PWD=password)

# ---- Función para escribir en la base de datos SQL ----
def WriteToSql(timestamp, cameraid, objectid, x, y, height):

    # Definición de la instrucción SQL INSERT
    add_camera_coordinates = "INSERT INTO camera_coordinates(ObservationTimestamp, CameraID, ObjectId, X, Y, Height, CreatedAt) VALUES (%s, %s, %s, %s, %s, %s, %s)"

    insert_tuple = (timestamp, cameraid, objectid, x, y, height, datetime.datetime.now())

    database_cursor = database_connection.cursor()     
    database_connection.commit()

Desafortunadamente, esta función devuelve el siguiente error:

pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 7 parameters were supplied', 'HY000')

¿Alguien sabe cómo escribir estos parámetros con PyODBC? Antes de eso, intenté usar Pymssql, pero tampoco encontré una solución allí.

¡Cualquier ayuda es muy apreciada!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que la declaración SQL está utilizando %s como marcadores de parámetros, que es una convención utilizada en algunos otros lenguajes de programación como Python, pero no en SQL. PyODBC utiliza ? como marcadores de parámetros para consultas SQL.

    Para solucionar esto, la declaración SQL debería ser revisada de la siguiente manera:

    add_camera_coordinates = "INSERT INTO camera_coordinates(ObservationTimestamp, CameraID, ObjectId, X, Y, Height, CreatedAt) VALUES (?, ?, ?, ?, ?, ?, ?)"
    

    Y la variable insert_tuple debe ser modificada en consecuencia:

    insert_tuple = (timestamp, cameraid, objectid, x, y, height, datetime.datetime.now())
    

    Finalmente, el cursor debe ser utilizado para ejecutar la declaración SQL con el parámetro insert_tuple:

    database_cursor.execute(add_camera_coordinates, insert_tuple)
    database_connection.commit()
    

    Esto debería permitir que la función escriba en la tabla SQL sin ningún error.

Comments are closed.