def update(self, i):
        """D.update(E) -> None.  Update D from iterable E with pre-existing
        items being overwritten.
        
        Elements in E are assumed to be dicts containing the primary key to
        allow the equivelent of:
        for k in E: D[k.primary_key] = k
        """
        key_list = self.key_list
        keynone = {key:None for key in key_list}
        # Generator which fills in missing data from the original iterator
        def datagen(i):
            for datum in i:
                tmp = keynone.copy()
                tmp.update(datum)
                yield tmp
        with self._connection as con:
            con.executemany(
                """INSERT OR REPLACE INTO {table} ({keylist})
                VALUES (:{vallist});
                """.format(table=self.table,
                    keylist=", ".join(self.key_list),
                    vallist=", :".join(self.key_list)
                ), datagen(i))