code: def update(self, i):
          
          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))
docs: 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