code: def _sync_table(self, columns):
          
          if self._table is None:
              # Load an existing table from the database.
              self._reflect_table()
          if self._table is None:
              # Create the table with an initial set of columns.
              if not self._auto_create:
                  raise DatasetException("Table does not exist: %s" % self.name)
              # Keep the lock scope small because this is run very often.
              with self.db.lock:
                  self._threading_warn()
                  self._table = SQLATable(self.name,
                                          self.db.metadata,
                                          schema=self.db.schema)
                  if self._primary_id is not False:
                      # This can go wrong on DBMS like MySQL and SQLite where
                      # tables cannot have no columns.
                      primary_id = self._primary_id or self.PRIMARY_DEFAULT
                      primary_type = self._primary_type or Types.integer
                      increment = primary_type in [Types.integer, Types.bigint]
                      column = Column(primary_id, primary_type,
                                      primary_key=True,
                                      autoincrement=increment)
                      self._table.append_column(column)
                  for column in columns:
                      if not column.name == self._primary_id:
                          self._table.append_column(column)
                  self._table.create(self.db.executable, checkfirst=True)
          elif len(columns):
              with self.db.lock:
                  self._reflect_table()
                  self._threading_warn()
                  for column in columns:
                      if not self.has_column(column.name):
                          self.db.op.add_column(self.name, column, self.db.schema)
                  self._reflect_table()
docs: Lazy load, create or adapt the table structure in the database.