这里的某个地方存在问题。 http://paste.pocoo.org/show/528559/
在第32行和第37行之间的某处。正如您所看到的,DELETE FROM位于for循环中。
运行脚本只会使程序通过循环并退出,而不会实际删除任何记录。
任何帮助将不胜感激!谢谢!
#!/usr/bin/env python
# encoding: utf-8
import os, os.path, MySQLdb, pprint, string
class MySQLclass(object):
"""Learning Classes"""
def __init__(self, db):
self.db=db
self.cursor = self.db.cursor()
def sversion(self):
self.cursor.execute ("SELECT VERSION()")
row = self.cursor.fetchone ()
server_version = "server version:", row[0]
return server_version
def getRows(self, tbl):
""" Returns the content of the table tbl """
statmt="select * from %s" % tbl
self.cursor.execute(statmt)
rows=list(self.cursor.fetchall())
return rows
def getEmailRows(self, tbl):
""" Returns the content of the table tbl """
statmt="select email from %s" % tbl
self.cursor.execute(statmt)
rows=list(self.cursor.fetchall())
return rows
def removeRow(self,tbl,record):
""" Remove specific record """
print "Removing %s from table %s" %(record,tbl)
print tbl
self.cursor.execute ("""DELETE FROM maillist_frogs where email LIKE %s""", (record,))
def main():
#####connections removed
sql_frogs = MySQLclass(conn_frogs)
sql_mailgust = MySQLclass(conn_mailgust)
frogs_emails = sql_frogs.getEmailRows ("emails")
frogs_systemcatch = sql_frogs.getEmailRows ("systemcatch")
mailgust_emails = sql_mailgust.getEmailRows ("maillist_frogs")
aa = set(mailgust_emails)
remove = aa.intersection(frogs_emails)
remove = remove.union(aa.intersection(frogs_systemcatch))
for x in remove:
x= x[0]
remove_mailgust = sql_mailgust.removeRow ("maillist_frogs",x)
conn_frogs.close ()
conn_mailgust.close ()
if __name__ == '__main__':
main()
答案 0 :(得分:2)
问题是python-msyqldb具体。:
从1.2.0开始,默认情况下,MySQLdb根据DB-API标准(PEP-249)的要求禁用自动提交。如果您使用的是InnoDB表或其他类型的事务表类型,则需要在关闭连接之前执行connection.commit(),否则您的更改都不会写入数据库。
因此,在DELETE之后,你必须是self.db.commit
答案 1 :(得分:1)
removeRow()
方法不返回值,但remove_mailgust
期望收到此不存在的值。
此外,您的removeRow()
类方法已静态修复,仅在其查询中搜索表maillist_frogs
。您应该将表名设置为接受方法的第二个参数tbl
。
最后,您的removeRow()
方法正在使用LIKE
比较记录的值(可能是id),这通常用于更混杂的字符串比较。 email
是此表中的主键吗?如果是这样,我建议将其更改为:
self.cursor.execute ("""DELETE FROM %s where email_id = %s""", (tbl, record,))