diff --git a/dataset/table.py b/dataset/table.py index b7bf815..e59dbb2 100644 --- a/dataset/table.py +++ b/dataset/table.py @@ -12,7 +12,7 @@ from sqlalchemy.exc import NoSuchTableError from dataset.types import Types from dataset.util import normalize_column_name, index_name, ensure_tuple from dataset.util import DatasetException, ResultIter, QUERY_STEP -from dataset.util import normalize_table_name +from dataset.util import normalize_table_name, pad_chunk_columns log = logging.getLogger(__name__) @@ -127,10 +127,12 @@ class Table(object): row = self._sync_columns(row, ensure, types=types) chunk.append(row) if len(chunk) == chunk_size: + chunk = pad_chunk_columns(chunk) self.table.insert().execute(chunk) chunk = [] if len(chunk): + chunk = pad_chunk_columns(chunk) self.table.insert().execute(chunk) def update(self, row, keys, ensure=None, types=None, return_count=False): diff --git a/dataset/util.py b/dataset/util.py index 2a82d15..04313cd 100644 --- a/dataset/util.py +++ b/dataset/util.py @@ -102,3 +102,15 @@ def ensure_tuple(obj): if isinstance(obj, Sequence) and not isinstance(obj, six.string_types): return tuple(obj) return obj, + + +def pad_chunk_columns(chunk): + """Given a set of items to be inserted, make sure they all have the + same columns by padding columns with None if they are missing.""" + columns = set() + for record in chunk: + columns.update(record.keys()) + for record in chunk: + for column in columns: + record.setdefault(column, None) + return chunk \ No newline at end of file