我在下面的代码中删除了日期列值为current_date的表中的所有行。
db = MySQLdb.connect("localhost",'root','XXXX','XXXX')
cur = db.cursor()
query = "delete from RealTimeData where date = current_date()"
cur.execute(query)
db.commit()
现在,我怎么知道我的查询从表中删除了多少行?
我尝试fetchone()
它正在返回None
答案 0 :(得分:4)
您可以使用Cursot.rowcount
属性:
cur.execute(query)
deleted_row_count = cur.rowcount
根据文件,
<强>
.rowcount
强>此只读属性指定最后一行的行数 .execute *()生成(对于像SELECT这样的DQL语句)或受影响 (对于像UPDATE或INSERT这样的DML语句)。 [9]
答案 1 :(得分:2)
在Linux中使用Python 2.7.5,MySQLdb版本1.2.5:
关键是API仅为SELECT,INSERT和UPDATE返回.rowcount。来自https://www.python.org/dev/peps/pep-0249/:
.rowcount:此只读属性指定最后一个.execute *()生成的行数(对于SELECT等DQL语句)或受影响的行(对于UPDATE或INSERT等DML语句)
请注意, NO 提及正在为DELETE更新此属性。关闭我的旧游标并在我的应用程序中创建一个新游标,我在DELETE语句后看到了.rowcount的结果为-1,完全如PEP249中所述。 (未来注释:返回值可能会更改为“无”而不是-1。)
所以, B计划:
with ... as mycursor:
mycursor.execute("DELETE FROM mytable WHERE id = %s", params=(myindex,))
mycursor.execute("SELECT ROW_COUNT() as rowcount")
rows = mycursor.fetchall()
rowcount = rows[0].get('rowcount', -1)
现在,变量rowcount具有执行DELETE SQL命令时删除的行数。
为什么不使用multi = True参数?来自https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html:
如果multi设置为True,则execute()能够执行操作字符串中指定的多个语句。它返回一个迭代器,用于处理每个语句的结果。但是,使用参数在这种情况下效果不佳,并且通常最好自己执行每个语句。
(强调我的。)使用这种代码技术,我能够验证DELETE语句实际上删除了指定的记录。