Number of rows inserted into SQLite db is negative

2019-03-06 05:46发布

问题:

I'm trying to insert new records into SQLite database from Python code.

  con = sqlite.connect(connectionString)
  cur = con.cursor()
  countOfNewItems = 0
  for ...
    try:
      con.execute("insert or ignore into items ...")
      countOfNewItems += cur.rowcount
    except:
      cur.close()
      con.close()
      print "Error when inserting item '%s' to database." % item
      exit(1)
  cur.close()
  con.commit()
  con.close()
  print "%d new items have been inserted." % countOfNewItems

My code reports negative number of inserted records (-5141).

Because my database was empty, I could find out how many records were inserted via command line

select count(*) from items;

4866

Could you advise me what's wrong. Why the two values don't match and why it's negative?

回答1:

Try cur.execute instead of con.execute. cur.rowcount then returns 1 for me for a simple insert.



回答2:

http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.rowcount

Although the Cursor class of the sqlite3 module implements this attribute, the database engine’s own support for the determination of “rows affected”/”rows selected” is quirky.

and

As required by the Python DB API Spec, the rowcount attribute “is -1 in case no executeXX() has been performed on the cursor or the rowcount of the last operation is not determinable by the interface”.