Question: I can't find my error in the following code. When it is run a type error is given for line: *cur.executemany(sql % itr.next())* => '**function takes exactly 2 arguments (1 given)**,

```
import sqlite3
con = sqlite3.connect('test.sqlite')
cur = con.cursor()
cur.execute("create table IF NOT EXISTS fred (dat)")

def newSave(className, fields, objData):
    sets = []
    itr = iter(objData)
    if len(fields) == 1:
        sets.append( ':' + fields[0])
    else:
        for name in fields:
            sets.append( ':' +  name)
    if len(sets)== 1:
        colNames = sets[0]
    else:
        colNames = ', '.join(sets)
    sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames)
    print itr.next()
    cur.executemany(sql  % itr.next())
    con.commit()

if __name__=='__main__':
    newSave('fred', ['dat'], [{'dat':1}, {'dat':2}, { 'dat':3}, {'dat':4}])

```

I would appreciate your thoughts.

Answer: 
See [the sqlite3 documentation](http://docs.python.org/library/sqlite3.html#sqlite3.Cursor.executemany). As you'll see, the `Cursor.executemany` method expects two parameters. Perhaps you mistook it for the `Connection.executemany` method which only takes one?
Perhaps you meant:

> 
> cur.executemany(sql, itr)
> 
> 
> 

also note that the print statement consumes one item from the iterator.