2012-10-02 26 views
10

que tienen este cursorerror: Cursor 'objeto no tiene atributo' _last_executed

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
        SELECT item_id FROM Purchases 
        WHERE purchaseID = %d AND customer_id = %d)", 
        [self.purchaseID, self.customer]) 

me sale este error

'Cursor' object has no attribute '_last_executed' 

Pero cuando intento esto:

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
        SELECT item_id FROM Purchases 
        WHERE purchaseID = 1 AND customer_id = 1)", 
       ) 

hay No hay error. ¿Cómo puedo solucionar esto?

+0

¿Finalmente conseguir que funcione? – juankysmith

+3

Tuve el mismo mensaje de error, pero usando el ORM. Resultó ser un problema de charset resuelto al encapsular mi cadena con unicode(). Sé que no responde su pregunta, pero podría coincidir con otras personas que llegan a esta página en busca de respuestas. –

+0

Gracias por publicar que Tommy, definitivamente me ayudó – Steve

Respuesta

5

El problema es que no está haciendo las sustituciones correctamente en su cadena de selección. De docs:

def execute(self, query, args=None): 

    """Execute a query. 

    query -- string, query to execute on server 
    args -- optional sequence or mapping, parameters to use with query. 

    Note: If args is a sequence, then %s must be used as the 
    parameter placeholder in the query. If a mapping is used, 
    %(key)s must be used as the placeholder. 

    Returns long integer rows affected, if any 

    """ 

Por lo tanto, debería ser:

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
       SELECT item_id FROM Purchases 
       WHERE purchaseID = ? AND customer_id = ?)", 
       (self.purchaseID, self.customer)) 
+0

Todavía produce el mismo error. – skinnyas123

+0

¿qué versión de python estás usando? – juankysmith

+0

Estoy usando Python 2.7.2+ – skinnyas123

8

me encontré con este problema también. Cambié el% d a% s, y está resuelto. Ojalá esto sea útil para ti.

+0

Esto funcionó para mí. Supongo que tienes que pasar '% s' incluso para los enteros. – user2233706

2

La razón es que está utilizando '% d'. Cuando usa '%' en SQL, la ejecución interpretará el '%' como el formato. Usted debe escribir su declaración como esta:

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
       SELECT item_id FROM Purchases 
       WHERE purchaseID = %%d AND customer_id = %%d)", 
       [self.purchaseID, self.customer]) 
+0

Tengo el mismo problema, pero la documentación de [consultas crudas] (https://docs.djangoproject.com/en/1.5/topics/db/sql/#executing-custom-sql-directly) dice que use una '%' para la sustitución. – user2233706

+0

Esto funcionó para mí en una situación similar – Himanshu

1

trabajado para mí usando doble %%

"SELECT title, address from table t1, table t2 on t1.id=t2.id where t1.title like '%%Brink%%' " 
+1

Para la persona que votó negativamente, ¿se debe explicar por qué? – Ram

Cuestiones relacionadas