Discovered an interesting variation in pyodbc behavior today. A coworker asked me if he needed to commit explicitly when using pyodbc to execute a stored procedure. I told him he did, but he protested that his code worked fine without it. Here's a paraphrased version:
with pyodbc.connect(cnxn_str) as db:
I tested it, and what do you know? It works. But the following does not:
db = pyodbc.connect(cnxn_str)
In this case, the results of proc will be rolled back automatically when closing the connection. So evidently the way that the with handler is coded includes an autocommit.