python mysqldb,for循环不删除记录

时间:2012-01-01 20:53:50

标签: python mysql

这里的某个地方存在问题。 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()

2 个答案:

答案 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,))