I'm kind of new to Python and its MySQLdb connector. I'm writing an API to return some data from a database using the RESTful approach. In PHP, I wrapped the Connection management part in a class, acting as an abstraction layer for MySQL queries.
In Python:
- I define the connection early on in the script: - con = mdb.connect('localhost', 'user', 'passwd', 'dbname')
- Then, in all subsequent methods: - import MySQLdb as mdb def insert_func(): with con: cur = con.cursor(mdb.cursors.DictCursor) cur.execute("INSERT INTO table (col1, col2, col3) VALUES (%s, %s, %s)", (val1, val2, val3) ) rows = cur.fetchall() #do something with the results return someval- etc. 
- I use - mdb.cursors.DictCursorbecause I prefer to be able to access database columns in an associative array manner.
Now the problems start popping up:
- in one function, I issue an insert query to create a 'group' with unique 'groupid'. 
- This 'group' has a creator. Every user in the database holds a JSON array in the 'groups' column of his/her row in the table. 
- So when I create a new group, I want to assign the groupid to the user that created it. 
- I update the user's record using a similar function. 
- I've wrapped the 'insert' and 'update' parts in two separate function defs. 
- The first time I run the script, everything works fine. 
- The second time I run the script, the script runs endlessly (I suspect due to some idle connection to the MySQL database). 
- When I interrupt it using CTRL + C, I get one of the following errors: - "'Cursor' object has no attribute 'connection'"
- "commands out of sync; you can't run this command now"
- or any other KeyboardInterrupt exception, as would be expected.
 
It seems to me that these errors are caused by some erroneous way of handling connections and cursors in my code.
I read it was good practice to use with con: so that the connection will automatically close itself after the query. I use 'with' on 'con' in each function, so the connection is closed, but I decided to define the connection globally, for any function to use it. This seems incompatible with the with con: context management. I suspect the cursor needs to be 'context managed' in a similar way, but I do not know how to do this (To my knowledge, PHP doesn't use cursors for MySQL, so I have no experience using them).
I now have the following questions:
- Why does it work the first time but not the second? (it will however, work again, once, after the CTRL + C interrupt). 
- How should I go about using connections and cursors when using multiple functions (that can be called upon in sequence)? 
 
     
     
     
    