use reflect to construct structs from rows
diff --git a/data.go b/data.go
index 24acb8d..9c801ca 100644
--- a/data.go
+++ b/data.go
@@ -18,6 +18,7 @@
 	"sync"
 
 	"github.com/30x/apid-core"
+	"reflect"
 )
 
 var (
@@ -230,70 +231,34 @@
 	return
 }
 
-func dataDeploymentsFromRow(rows *sql.Rows) (deployments []DataDeployment, err error) {
+func dataDeploymentsFromRow(rows *sql.Rows) ([]DataDeployment, error) {
+	tmp, err := structFromRows(reflect.TypeOf((*DataDeployment)(nil)).Elem(), rows)
+	if err != nil {
+		return nil, err
+	}
+	return tmp.([]DataDeployment), nil
+}
+
+func structFromRows(t reflect.Type, rows *sql.Rows) (interface{}, error) {
+	num := t.NumField()
+	cols := make([]interface{}, num)
+	slice := reflect.New(reflect.SliceOf(t)).Elem()
+	for i := range cols {
+		cols[i] = new(sql.NullString)
+	}
 	for rows.Next() {
-		dep := DataDeployment{}
-		var id, orgId, envId, blobId, blobResourceID, colType, name, revision, path, created, createdBy, updated, updatedBy sql.NullString
-		err = rows.Scan(
-			&id,
-			&orgId,
-			&envId,
-			&blobId,
-			&blobResourceID,
-			&colType,
-			&name,
-			&revision,
-			&path,
-			&created,
-			&createdBy,
-			&updated,
-			&updatedBy,
-		)
+		v := reflect.New(t).Elem()
+		err := rows.Scan(cols...)
 		if err != nil {
 			return nil, err
 		}
-
-		if id.Valid {
-			dep.ID = id.String
+		for i := range cols {
+			p := cols[i].(*sql.NullString)
+			if p.Valid {
+				v.Field(i).SetString(p.String)
+			}
 		}
-		if orgId.Valid {
-			dep.OrgID = orgId.String
-		}
-		if envId.Valid {
-			dep.EnvID = envId.String
-		}
-		if blobId.Valid {
-			dep.BlobID = blobId.String
-		}
-		if blobResourceID.Valid {
-			dep.BlobResourceID = blobResourceID.String
-		}
-		if colType.Valid {
-			dep.Type = colType.String
-		}
-		if name.Valid {
-			dep.Name = name.String
-		}
-		if revision.Valid {
-			dep.Revision = revision.String
-		}
-		if path.Valid {
-			dep.Path = path.String
-		}
-		if created.Valid {
-			dep.Created = created.String
-		}
-		if createdBy.Valid {
-			dep.CreatedBy = createdBy.String
-		}
-		if updated.Valid {
-			dep.Updated = updated.String
-		}
-		if updatedBy.Valid {
-			dep.UpdatedBy = updatedBy.String
-		}
-
-		deployments = append(deployments, dep)
+		slice = reflect.Append(slice, v)
 	}
-	return
+	return slice.Interface(), nil
 }