12

I have this cursor

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

I get this error

'Cursor' object has no attribute '_last_executed'

But when I try this:

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

there is no error. How do I fix this?

General Grievance
  • 4,555
  • 31
  • 31
  • 45
skinnyas123
  • 382
  • 1
  • 4
  • 13
  • Did you finally get it working? – juankysmith Oct 05 '12 at 11:30
  • 3
    I had the same error message, but using the ORM. It turned out to be charset problem solved with encapsulating my string with unicode(). I know it does not answer your question, but it might fit with others that land upon this page in search for answers. – Tommy Strand Jan 09 '13 at 22:10

6 Answers6

8

I encountered this problem too. I changed the %d to %s, and it is solved. Wish this is useful for you.

bigwind
  • 161
  • 2
  • 8
5

The problem is that you are not making substitutions properly in your select string. From 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

    """

So, it should be:

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
              SELECT item_id FROM Purchases 
              WHERE purchaseID = ? AND customer_id = ?)", 
              (self.purchaseID, self.customer))
juankysmith
  • 11,839
  • 5
  • 37
  • 62
2

The reason is that you are using '%d'. When you use '%' in SQL, the execute will interpret the '%' as the format. You should write your statement like this:

cursor.execute("SELECT price FROM Items WHERE itemID = ( 
                SELECT item_id FROM Purchases 
                WHERE purchaseID = %%d AND customer_id = %%d)", 
                [self.purchaseID, self.customer])
muyline
  • 29
  • 3
  • I'm having the same problem, but documentation for [raw queries](https://docs.djangoproject.com/en/1.5/topics/db/sql/#executing-custom-sql-directly) says to use one `%` for substitution. – user2233706 Sep 02 '13 at 03:44
2

Depending on your SQL package, you may need to use cursor.statement instead.

Pikamander2
  • 7,332
  • 3
  • 48
  • 69
1

Worked for me using double %%

  "SELECT  title, address from table t1, table t2 on t1.id=t2.id where t1.title like '%%Brink%%' "
Ram
  • 113
  • 1
  • 10
0
from django.db import connection
print(connection.queries)

The code above should display all the requeries that are executed on the request.