Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26314631
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2009-09-04 19:13:46

执行数据库删除,使用了django的cursor.execute(sql)进行删除数据,发现了奇怪问题,有时候可以执行成功,有的时候执行不成功。

通过SQL的监控看到SQL语句是正常的,就是没有执行commit

代码应该是没问题的:

Python代码
  1. from django.db import connection  
  2. cursor = connection.cursor()  
  3. cursor.execute("delete from event where id=%s",[event_id])  
  4. cursor.close()  

想不通问题出在什么地方,有的地方用类似的代码就可以,最后还是改成了django自己的那套删除方法:

object.delete()

 自己也封装了个数据库操作的类。

Python代码
  1. class Database:  
  2.       
  3.     def get_connection(self):  
  4.         connection = Connection(host="localhost",user="root",passwd="",use_unicode=True,charset="utf8")  
  5.         connection.select_db(‘ppsea_main’)  
  6.         return connection  
  7.       
  8.     def get_cursor(self):  
  9.         return self.get_connection().cursor()  
  10.       
  11.     # 根据SQL取一条指定数据  
  12.     def select_fetchone(self,sql):  
  13.         cursor = self.get_cursor()  
  14.         cursor.execute(sql)  
  15.         print "select_fetchone sql: %s" %(sql)  
  16.         object = cursor.fetchone()  
  17.         desc = cursor.description  
  18.           
  19.         if object:  
  20.             print object  
  21.             d = {}  
  22.             i = 0  
  23.             for item in desc:  
  24.                 d[item[0]] = object[i]  
  25.                 i=i+1  
  26.             print "one %s" %(d)  
  27.             return d  
  28.         else:  
  29.             return object  
  30.   
  31.   
  32.     # 根据SQL取的数据列表  
  33.     def select_fetchall(self,sql):  
  34.         cursor = self.get_cursor()  
  35.         cursor.execute(sql)  
  36.           
  37.         print "select_fetchall sql: %s" %(sql)  
  38.           
  39.         items = cursor.fetchall()  
  40.           
  41.         desc = cursor.description  
  42.         li = []  
  43.         if items:  
  44.             for item in items:                  
  45.                 d = {}  
  46.                 i = 0  
  47.                 for de in desc:  
  48.                     d[de[0]] = item[i]  
  49.                     i=i+1  
  50.                 li.append(d);  
  51.             return li  
  52.         else:  
  53.             return li  
  54.       
  55.           
  56.     # 执行插入和更新  
  57.     def execute(self,sql):  
  58.         print "execute sql : %s" %(sql)  
  59.         connection = self.get_connection()  
  60.         cursor=connection.cursor()  
  61.         cursor.execute(sql)  
  62.         connection.commit()  

通过自己的方法调用也没问题,自己的理解应该是django中使用cursor.execute执行后没有commit。

不知道是不是django的版本问题,我用的是Django-1.0.2-final,遇到类似问题的哥们可以一起讨论讨论。

更新:

经过不断尝试,终于试出解决方法,在execute后加上cursor.execute("commit")

完整代码:

Python代码
  1. from django.db import connection    
  2. cursor = connection.cursor()    
  3. cursor.execute("delete from event where id=%s",[event_id])    
  4. cursor.execute("commit")   
  5. cursor.close()  
阅读(1128) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

hkebao2010-02-26 13:25:05

我昏S了。靠今天又遇到了这个鬼问题。一直更新不了一个SQL语句 搞了半天终于加上 cursor.execute("commit") 才正常。NND