Repository: schemahero/schemahero
Pull request #112 (2020-01-18 00:37:30)

Remove v1alpha2


Patch:
diff --git a/.github/workflows/alpha-release.yaml b/.github/workflows/alpha-release.yaml
new file mode 100644
index 00000000..ba782643
--- /dev/null
+++ b/.github/workflows/alpha-release.yaml
@@ -0,0 +1,101 @@
+name: "Alpha release"
+on:
+  push:
+    branches:
+      - master
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/setup-go@v1
+        with:
+          go-version: "1.12.14"
+      - name: setup goenv
+        run: |
+          echo "::set-env name=GOPATH::$(go env GOPATH)"
+          echo "::add-path::$(go env GOPATH)/bin"
+        shell: bash
+      - uses: actions/checkout@master
+      - name: setup kubebuilder
+        run: |
+          echo "::add-path::/usr/local/kubebuilder/bin"
+      - run: make kubebuilder all
+      - uses: actions/upload-artifact@v1
+        with:
+          name: schemahero
+          path: bin/schemahero
+      - uses: actions/upload-artifact@v1
+        with:
+          name: manager
+          path: bin/manager
+      - uses: actions/upload-artifact@v1
+        with:
+          name: kubectl-schemahero
+          path: bin/kubectl-schemahero
+
+  ## We list each here so that they all show up in the output of github checks
+  test-postgres:
+    runs-on: ubuntu-latest
+    needs: build
+    steps:
+      - uses: actions/checkout@master
+      - name: Download schemahero binary
+        uses: actions/download-artifact@v1
+        with:
+          name: schemahero
+          path: bin/
+      - run: chmod +x bin/schemahero
+      - run: make -C integration/tests/postgres/column-set-default run
+      - run: make -C integration/tests/postgres/column-unset-default run
+      - run: make -C integration/tests/postgres/create-table run
+      - run: make -C integration/tests/postgres/foreign-key-create run
+      - run: make -C integration/tests/postgres/foreign-key-action run
+      - run: make -C integration/tests/postgres/foreign-key-drop run
+      - run: make -C integration/tests/postgres/foreign-key-alter run
+      - run: make -C integration/tests/postgres/not-null run
+      - run: make -C integration/tests/postgres/index-create run
+      - run: make -C integration/tests/postgres/primary-key-add run
+      - run: make -C integration/tests/postgres/primary-key-drop run
+
+  ## We list each here so that they all show up in the output of github checks
+  test-mysql:
+    runs-on: ubuntu-latest
+    needs: build
+    steps:
+      - uses: actions/checkout@master
+      - name: Download schemahero binary
+        uses: actions/download-artifact@v1
+        with:
+          name: schemahero
+          path: bin/
+      - run: chmod +x bin/schemahero
+      - run: make -C integration/tests/mysql/column-set-default run
+      - run: make -C integration/tests/mysql/column-unset-default run
+      - run: make -C integration/tests/mysql/create-table run
+      - run: make -C integration/tests/mysql/foreign-key-create run
+      - run: make -C integration/tests/mysql/foreign-key-action run
+      - run: make -C integration/tests/mysql/foreign-key-drop run
+      - run: make -C integration/tests/mysql/foreign-key-alter run
+      - run: make -C integration/tests/mysql/not-null run
+      - run: make -C integration/tests/mysql/index-create run
+      - run: make -C integration/tests/mysql/primary-key-add run
+      - run: make -C integration/tests/mysql/primary-key-drop run
+
+  goreleaser:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Unshallow
+        run: git fetch --prune --unshallow
+      - uses: actions/setup-go@v1
+        with:
+          go-version: "1.12.14"
+      - name: Run GoReleaser
+        uses: goreleaser/goreleaser-action@v1
+        with:
+          version: latest
+          args: release --rm-dist
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/tagged-release.yaml b/.github/workflows/tagged-release.yaml
index 6c0b8811..31ac21da 100644
--- a/.github/workflows/tagged-release.yaml
+++ b/.github/workflows/tagged-release.yaml
@@ -83,9 +83,6 @@ jobs:
 
   goreleaser:
     runs-on: ubuntu-latest
-    needs:
-      - test-postgres
-      - test-mysql
     steps:
       - name: Checkout
         uses: actions/checkout@v2
@@ -98,6 +95,6 @@ jobs:
         uses: goreleaser/goreleaser-action@v1
         with:
           version: latest
-          args: release --rm-dist --config deploy/.goreleaser.yaml
+          args: release --rm-dist
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/Makefile b/Makefile
index ceff8917..7280b8bc 100644
--- a/Makefile
+++ b/Makefile
@@ -104,12 +104,26 @@ bin/kubectl-schemahero:
 		./cmd/kubectl-schemahero
 	@echo "built bin/kubectl-schemahero"
 
+.PHONY: snapshot-release
+snapshot-release: build-snapshot-release
+	docker push schemahero/schemahero:alpha
+	docker push schemahero/schemahero-manager:alpha
+
+.PHONY: build-snapshot-release
+build-snapshot-release:
+	curl -sL https://git.io/goreleaser | bash -s -- --rm-dist --snapshot --config deploy/.goreleaser.snapshot.yml
+
 .PHONY: microk8s
 microk8s: bin/schemahero bin/kubectl-schemahero manager
 	docker build -t schemahero/schemahero -f ./Dockerfile.schemahero .
 	docker tag schemahero/schemahero localhost:32000/schemahero/schemahero:latest
 	docker push localhost:32000/schemahero/schemahero:latest
 
+.PHONY: release
+release: export GITHUB_TOKEN = $(shell echo ${GITHUB_TOKEN_REPLICATEDBOT})
+release:
+	curl -sL https://git.io/goreleaser | bash -s -- --rm-dist --config deploy/.goreleaser.yml
+
 .PHONY: contoller-gen
 controller-gen:
 ifeq (, $(shell which controller-gen))
diff --git a/deploy/.goreleaser.yaml b/deploy/.goreleaser.snapshot.yml
similarity index 60%
rename from deploy/.goreleaser.yaml
rename to deploy/.goreleaser.snapshot.yml
index 854a0060..678a75df 100644
--- a/deploy/.goreleaser.yaml
+++ b/deploy/.goreleaser.snapshot.yml
@@ -23,25 +23,6 @@ builds:
     flags: -tags netgo -installsuffix netgo
     binary: schemahero
     hooks: {}
-  - id: kubectl-schemahero
-    goos:
-      - linux
-      - windows
-      - darwin
-    goarch:
-      - amd64
-      - "386"
-    env:
-      - CGO_ENABLED=0
-    main: cmd/kubectl-schemahero/main.go
-    ldflags: -s -w
-      -X github.com/schemahero/schemahero/pkg/version.version={{.Version}}
-      -X github.com/schemahero/schemahero/pkg/version.gitSHA={{.Commit}}
-      -X github.com/schemahero/schemahero/pkg/version.buildTime={{.Date}}
-      -extldflags "-static"
-    flags: -tags netgo -installsuffix netgo
-    binary: kubectl-schemahero
-    hooks: {}
   - id: manager
     goos:
       - linux
@@ -61,7 +42,7 @@ builds:
 archives:
   - id: tar
     format: tar.gz
-    name_template: "{{ .Binary }}_{{ .Os }}_{{ .Arch }}"
+    name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{.Arm }}{{ end }}-alpha'
     files:
       - licence*
       - LICENCE*
@@ -74,15 +55,13 @@ archives:
 dockers:
   - dockerfile: ./deploy/Dockerfile.schemahero
     image_templates:
-      - "schemahero/schemahero:{{.Major}}"
-      - "schemahero/schemahero:{{.Major}}.{{.Minor}}"
-      - "schemahero/schemahero:{{.Major}}.{{.Minor}}.{{.Patch}}"
+      - "schemahero/schemahero:alpha"
     binaries:
       - schemahero
   - dockerfile: ./deploy/Dockerfile.manager
     image_templates:
-      - "schemahero/schemahero-manager:{{.Major}}"
-      - "schemahero/schemahero-manager:{{.Major}}.{{.Minor}}"
-      - "schemahero/schemahero-manager:{{.Major}}.{{.Minor}}.{{.Patch}}"
+      - "schemahero/schemahero-manager:alpha"
     binaries:
       - manager
+snapshot:
+  name_template: SNAPSHOT-{{ .Commit }}
diff --git a/deploy/.goreleaser.yml b/deploy/.goreleaser.yml
new file mode 100644
index 00000000..a095645b
--- /dev/null
+++ b/deploy/.goreleaser.yml
@@ -0,0 +1,65 @@
+project_name: schemahero
+release:
+  github:
+    owner: schemahero
+    name: schemahero
+builds:
+  - id: schemahero
+    goos:
+      - linux
+      - windows
+      - darwin
+    goarch:
+      - amd64
+      - "386"
+    env:
+      - CGO_ENABLED=0
+    main: cmd/schemahero/main.go
+    ldflags: -s -w
+      -X github.com/schemahero/schemahero/pkg/version.version={{.Version}}
+      -X github.com/schemahero/schemahero/pkg/version.gitSHA={{.Commit}}
+      -X github.com/schemahero/schemahero/pkg/version.buildTime={{.Date}}
+      -extldflags "-static"
+    flags: -tags netgo -installsuffix netgo
+    binary: schemahero
+    hooks: {}
+  - id: manager
+    goos:
+      - linux
+    goarch:
+      - amd64
+    env:
+      - CGO_ENABLED=0
+    main: cmd/manager/main.go
+    ldflags: -s -w
+      -X github.com/schemahero/schemahero/pkg/version.version={{.Version}}
+      -X github.com/schemahero/schemahero/pkg/version.gitSHA={{.Commit}}
+      -X github.com/schemahero/schemahero/pkg/version.buildTime={{.Date}}
+      -extldflags "-static"
+    flags: -tags netgo -installsuffix netgo
+    binary: manager
+    hooks: {}
+archives:
+  - id: tar
+    format: tar.gz
+    name_template: '{{ .Binary }}_{{.Version}}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{.Arm }}{{ end }}-alpha'
+    files:
+      - licence*
+      - LICENCE*
+      - license*
+      - LICENSE*
+      - readme*
+      - README*
+      - changelog*
+      - CHANGELOG*
+dockers:
+  - dockerfile: ./deploy/Dockerfile.schemahero
+    image_templates:
+      - "schemahero/schemahero:{{.Version}}"
+    binaries:
+      - schemahero
+  - dockerfile: ./deploy/Dockerfile.manager
+    image_templates:
+      - "schemahero/schemahero-manager:{{.Version}}"
+    binaries:
+      - manager
diff --git a/pkg/apis/addtoscheme_databases_v1alpha2.go b/pkg/apis/addtoscheme_databases_v1alpha2.go
deleted file mode 100644
index d969fe1d..00000000
--- a/pkg/apis/addtoscheme_databases_v1alpha2.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package apis
-
-import "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha2"
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
-}
diff --git a/pkg/apis/addtoscheme_schemas_v1alpha2.go b/pkg/apis/addtoscheme_schemas_v1alpha2.go
deleted file mode 100644
index 5b5bef05..00000000
--- a/pkg/apis/addtoscheme_schemas_v1alpha2.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package apis
-
-import (
-	"github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
-)
-
-func init() {
-	// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
-	AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
-}
diff --git a/pkg/apis/apis.go b/pkg/apis/apis.go
index 8b763ed5..ac20a15c 100644
--- a/pkg/apis/apis.go
+++ b/pkg/apis/apis.go
@@ -16,7 +16,7 @@ limitations under the License.
 
 // Generate deepcopy for apis
 //go:generate go run ../../vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go -O zz_generated.deepcopy -i ./... -h ../../hack/boilerplate.go.txt
-//go:generate go run ../../vendor/k8s.io/code-generator/cmd/client-gen/main.go --output-package=github.com/schemahero/schemahero/pkg/client --clientset-name schemaheroclientset --input-base github.com/schemahero/schemahero/pkg/apis --input databases/v1alpha2 --input schemas/v1alpha2 -h ../../hack/boilerplate.go.txt
+//go:generate go run ../../vendor/k8s.io/code-generator/cmd/client-gen/main.go --output-package=github.com/schemahero/schemahero/pkg/client --clientset-name schemaheroclientset --input-base github.com/schemahero/schemahero/pkg/apis --input databases/v1alpha3 --input schemas/v1alpha3 -h ../../hack/boilerplate.go.txt
 
 // Package apis contains Kubernetes API groups.
 package apis
diff --git a/pkg/apis/databases/v1alpha2/database_types.go b/pkg/apis/databases/v1alpha2/database_types.go
deleted file mode 100644
index 5d10a9b4..00000000
--- a/pkg/apis/databases/v1alpha2/database_types.go
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// DatabaseConnection defines connection parameters for the database driver
-type DatabaseConnection struct {
-	Postgres *PostgresConnection `json:"postgres,omitempty"`
-	Mysql    *MysqlConnection    `json:"mysql,omitempty"`
-}
-
-type SchemaHero struct {
-	Image        string            `json:"image,omitempty"`
-	NodeSelector map[string]string `json:"nodeSelector,omitempty"`
-}
-
-type GitOps struct {
-	URL           string   `json:"url"`
-	PollInterval  string   `json:"pollInterval,omitempty"`
-	Branch        string   `json:"branch,omitempty"`
-	Paths         []string `json:"paths,omitempty"`
-	IsPlanEnabled bool     `json:"isPlanEnabled,omitEmpty"`
-}
-
-// DatabaseStatus defines the observed state of Database
-type DatabaseStatus struct {
-	IsConnected      bool              `json:"isConnected"`
-	LastPing         string            `json:"lastPing"`
-	GitRepoStatus    string            `json:"gitRepoStatus,omitempty"`
-	GitopsPlanStatus string            `json:"gitopsPlanStatus,omitempty"`
-	GitopsPlanPulls  map[string]string `json:"gitopsPlanPulls,omitempty"`
-}
-
-// +genclient
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// Database is the Schema for the databases API
-// +k8s:openapi-gen=true
-// +kubebuilder:subresource:status
-// +kubebuilder:storageversion
-type Database struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	SchemaHero *SchemaHero        `json:"schemahero,omitempty"`
-	Connection DatabaseConnection `json:"connection,omitempty"`
-	GitOps     *GitOps            `json:"gitops,omitempty"`
-
-	Status DatabaseStatus `json:"status,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// DatabaseList contains a list of Database
-type DatabaseList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-	Items           []Database `json:"items"`
-}
-
-func init() {
-	SchemeBuilder.Register(&Database{}, &DatabaseList{})
-}
diff --git a/pkg/apis/databases/v1alpha2/doc.go b/pkg/apis/databases/v1alpha2/doc.go
deleted file mode 100644
index 4397e5f8..00000000
--- a/pkg/apis/databases/v1alpha2/doc.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Package v1alpha2 contains API Schema definitions for the databases v1alpha2 API group
-// +k8s:openapi-gen=true
-// +k8s:deepcopy-gen=package,register
-// +k8s:conversion-gen=github.com/schemahero/schemahero/pkg/apis/databases
-// +k8s:defaulter-gen=TypeMeta
-// +groupName=databases.schemahero.io
-package v1alpha2
diff --git a/pkg/apis/databases/v1alpha2/mysql_types.go b/pkg/apis/databases/v1alpha2/mysql_types.go
deleted file mode 100644
index dda36b7e..00000000
--- a/pkg/apis/databases/v1alpha2/mysql_types.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-type MysqlConnection struct {
-	URI ValueOrValueFrom `json:"uri,omitempty"`
-}
diff --git a/pkg/apis/databases/v1alpha2/postgres_types.go b/pkg/apis/databases/v1alpha2/postgres_types.go
deleted file mode 100644
index dc2ccc6f..00000000
--- a/pkg/apis/databases/v1alpha2/postgres_types.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-type PostgresConnection struct {
-	URI ValueOrValueFrom `json:"uri,omitempty"`
-}
diff --git a/pkg/apis/databases/v1alpha2/register.go b/pkg/apis/databases/v1alpha2/register.go
deleted file mode 100644
index 08fcf0c0..00000000
--- a/pkg/apis/databases/v1alpha2/register.go
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// NOTE: Boilerplate only.  Ignore this file.
-
-// Package v1alpha2 contains API Schema definitions for the databases v1alpha2 API group
-// +k8s:openapi-gen=true
-// +k8s:deepcopy-gen=package,register
-// +k8s:conversion-gen=github.com/schemahero/schemahero/pkg/apis/databases
-// +k8s:defaulter-gen=TypeMeta
-// +groupName=databases.schemahero.io
-package v1alpha2
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "databases.schemahero.io", Version: "v1alpha2"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-
-	// AddToScheme is required by pkg/client/...
-	AddToScheme = SchemeBuilder.AddToScheme
-)
-
-// Resource is required by pkg/client/listers/...
-func Resource(resource string) schema.GroupResource {
-	return SchemeGroupVersion.WithResource(resource).GroupResource()
-}
diff --git a/pkg/apis/databases/v1alpha2/string_or_value.go b/pkg/apis/databases/v1alpha2/string_or_value.go
deleted file mode 100644
index 6d374673..00000000
--- a/pkg/apis/databases/v1alpha2/string_or_value.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package v1alpha2
-
-import "fmt"
-
-func (ir *InlineOrRef) UnmarshalYAML(unmarshal func(interface{}) error) error {
-	var inline string
-	err := unmarshal(&inline)
-	if err == nil {
-		ir.Value = inline
-		return nil
-	}
-
-	type otherType struct {
-		ValueFrom *ValueFrom `yaml:"valueFrom,omitempty" yaml:"valueFrom,omitempty"`
-	}
-	var t otherType
-	err = unmarshal(&t)
-	if err != nil {
-		fmt.Println(err)
-		return err
-	}
-
-	ir.copyValueFrom(t.ValueFrom)
-
-	return nil
-}
-
-func (ir *InlineOrRef) copyValueFrom(valueFrom *ValueFrom) {
-	ir.ValueFrom = &ValueFrom{}
-
-	if valueFrom.SecretKeyRef != nil {
-		ir.ValueFrom.SecretKeyRef = &SecretKeyRef{
-			Name: valueFrom.SecretKeyRef.Name,
-			Key:  valueFrom.SecretKeyRef.Key,
-		}
-	}
-}
-
-type InlineOrRef struct {
-	Value     string     `json:"-" yaml:"-"`
-	ValueFrom *ValueFrom `json:"valueFrom,omitempty" yaml:"valueFrom,omitempty"`
-}
-
-type ValueFrom struct {
-	SecretKeyRef *SecretKeyRef `json:"secretKeyRef,omitempty" yaml:"secretKeyRef,omitempty"`
-}
-
-type SecretKeyRef struct {
-	Name string `json:"name" yaml:"name"`
-	Key  string `json:"key" yaml:"key"`
-}
diff --git a/pkg/apis/databases/v1alpha2/value_or_value_from.go b/pkg/apis/databases/v1alpha2/value_or_value_from.go
deleted file mode 100644
index 4be38224..00000000
--- a/pkg/apis/databases/v1alpha2/value_or_value_from.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package v1alpha2
-
-type ValueOrValueFrom struct {
-	Value     string     `json:"value,omitempty" yaml:"value,omitempty"`
-	ValueFrom *ValueFrom `json:"valueFrom,omitempty" yaml:"valueFrom,omitempty"`
-}
diff --git a/pkg/apis/databases/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/databases/v1alpha2/zz_generated.deepcopy.go
deleted file mode 100644
index 490c120e..00000000
--- a/pkg/apis/databases/v1alpha2/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,242 +0,0 @@
-// +build !ignore_autogenerated
-
-// autogenerated by controller-gen object, do not modify manually
-
-package v1alpha2
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Database) DeepCopyInto(out *Database) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	if in.SchemaHero != nil {
-		in, out := &in.SchemaHero, &out.SchemaHero
-		*out = new(SchemaHero)
-		(*in).DeepCopyInto(*out)
-	}
-	in.Connection.DeepCopyInto(&out.Connection)
-	out.Status = in.Status
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Database.
-func (in *Database) DeepCopy() *Database {
-	if in == nil {
-		return nil
-	}
-	out := new(Database)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Database) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DatabaseConnection) DeepCopyInto(out *DatabaseConnection) {
-	*out = *in
-	if in.Postgres != nil {
-		in, out := &in.Postgres, &out.Postgres
-		*out = new(PostgresConnection)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.Mysql != nil {
-		in, out := &in.Mysql, &out.Mysql
-		*out = new(MysqlConnection)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DatabaseConnection.
-func (in *DatabaseConnection) DeepCopy() *DatabaseConnection {
-	if in == nil {
-		return nil
-	}
-	out := new(DatabaseConnection)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DatabaseList) DeepCopyInto(out *DatabaseList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	out.ListMeta = in.ListMeta
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Database, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DatabaseList.
-func (in *DatabaseList) DeepCopy() *DatabaseList {
-	if in == nil {
-		return nil
-	}
-	out := new(DatabaseList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *DatabaseList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DatabaseStatus) DeepCopyInto(out *DatabaseStatus) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DatabaseStatus.
-func (in *DatabaseStatus) DeepCopy() *DatabaseStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(DatabaseStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *InlineOrRef) DeepCopyInto(out *InlineOrRef) {
-	*out = *in
-	if in.ValueFrom != nil {
-		in, out := &in.ValueFrom, &out.ValueFrom
-		*out = new(ValueFrom)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InlineOrRef.
-func (in *InlineOrRef) DeepCopy() *InlineOrRef {
-	if in == nil {
-		return nil
-	}
-	out := new(InlineOrRef)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *MysqlConnection) DeepCopyInto(out *MysqlConnection) {
-	*out = *in
-	in.URI.DeepCopyInto(&out.URI)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MysqlConnection.
-func (in *MysqlConnection) DeepCopy() *MysqlConnection {
-	if in == nil {
-		return nil
-	}
-	out := new(MysqlConnection)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *PostgresConnection) DeepCopyInto(out *PostgresConnection) {
-	*out = *in
-	in.URI.DeepCopyInto(&out.URI)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PostgresConnection.
-func (in *PostgresConnection) DeepCopy() *PostgresConnection {
-	if in == nil {
-		return nil
-	}
-	out := new(PostgresConnection)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SchemaHero) DeepCopyInto(out *SchemaHero) {
-	*out = *in
-	if in.NodeSelector != nil {
-		in, out := &in.NodeSelector, &out.NodeSelector
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchemaHero.
-func (in *SchemaHero) DeepCopy() *SchemaHero {
-	if in == nil {
-		return nil
-	}
-	out := new(SchemaHero)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SecretKeyRef) DeepCopyInto(out *SecretKeyRef) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretKeyRef.
-func (in *SecretKeyRef) DeepCopy() *SecretKeyRef {
-	if in == nil {
-		return nil
-	}
-	out := new(SecretKeyRef)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ValueFrom) DeepCopyInto(out *ValueFrom) {
-	*out = *in
-	if in.SecretKeyRef != nil {
-		in, out := &in.SecretKeyRef, &out.SecretKeyRef
-		*out = new(SecretKeyRef)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValueFrom.
-func (in *ValueFrom) DeepCopy() *ValueFrom {
-	if in == nil {
-		return nil
-	}
-	out := new(ValueFrom)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ValueOrValueFrom) DeepCopyInto(out *ValueOrValueFrom) {
-	*out = *in
-	if in.ValueFrom != nil {
-		in, out := &in.ValueFrom, &out.ValueFrom
-		*out = new(ValueFrom)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValueOrValueFrom.
-func (in *ValueOrValueFrom) DeepCopy() *ValueOrValueFrom {
-	if in == nil {
-		return nil
-	}
-	out := new(ValueOrValueFrom)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/databases/v1alpha3/v1alpha2.go b/pkg/apis/databases/v1alpha3/v1alpha2.go
deleted file mode 100644
index 6df9fd8a..00000000
--- a/pkg/apis/databases/v1alpha3/v1alpha2.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package v1alpha3
-
-import (
-	"github.com/schemahero/schemahero/pkg/apis/databases/v1alpha2"
-)
-
-func ConvertFromV1Alpha2(instance *v1alpha2.Database) *Database {
-	converted := &Database{
-		TypeMeta:   instance.TypeMeta,
-		ObjectMeta: instance.ObjectMeta,
-	}
-
-	converted.Status = DatabaseStatus{
-		IsConnected: instance.Status.IsConnected,
-		LastPing:    instance.Status.LastPing,
-	}
-
-	connection := DatabaseConnection{}
-	if instance.Connection.Postgres != nil {
-		postgres := PostgresConnection{
-			URI: ConvertValueOrValueFromFromV1Alpha2(instance.Connection.Postgres.URI),
-		}
-		connection.Postgres = &postgres
-	}
-
-	converted.Connection = connection
-
-	if instance.SchemaHero != nil {
-		schemaHero := SchemaHero(*instance.SchemaHero)
-		converted.SchemaHero = &schemaHero
-	}
-
-	return converted
-}
diff --git a/pkg/apis/databases/v1alpha3/value_or_value_from.go b/pkg/apis/databases/v1alpha3/value_or_value_from.go
index a8ccc1e0..b07b59cc 100644
--- a/pkg/apis/databases/v1alpha3/value_or_value_from.go
+++ b/pkg/apis/databases/v1alpha3/value_or_value_from.go
@@ -1,30 +1,6 @@
 package v1alpha3
 
-import (
-	"github.com/schemahero/schemahero/pkg/apis/databases/v1alpha2"
-)
-
 type ValueOrValueFrom struct {
 	Value     string     `json:"value,omitempty" yaml:"value,omitempty"`
 	ValueFrom *ValueFrom `json:"valueFrom,omitempty" yaml:"valueFrom,omitempty"`
 }
-
-func ConvertValueOrValueFromFromV1Alpha2(instance v1alpha2.ValueOrValueFrom) ValueOrValueFrom {
-	converted := ValueOrValueFrom{
-		Value: instance.Value,
-	}
-
-	if instance.ValueFrom != nil {
-		valueFrom := ValueFrom{}
-		if instance.ValueFrom.SecretKeyRef != nil {
-			valueFrom.SecretKeyRef = &SecretKeyRef{
-				Name: instance.ValueFrom.SecretKeyRef.Name,
-				Key:  instance.ValueFrom.SecretKeyRef.Key,
-			}
-		}
-
-		converted.ValueFrom = &valueFrom
-	}
-
-	return converted
-}
diff --git a/pkg/apis/schemas/v1alpha2/doc.go b/pkg/apis/schemas/v1alpha2/doc.go
deleted file mode 100644
index f96862a9..00000000
--- a/pkg/apis/schemas/v1alpha2/doc.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Package v1alpha2 contains API Schema definitions for the schemas v1alpha2 API group
-// +k8s:openapi-gen=true
-// +k8s:deepcopy-gen=package,register
-// +k8s:conversion-gen=github.com/schemahero/schemahero/pkg/apis/schemas
-// +k8s:defaulter-gen=TypeMeta
-// +groupName=schemas.schemahero.io
-package v1alpha2
diff --git a/pkg/apis/schemas/v1alpha2/migration_types.go b/pkg/apis/schemas/v1alpha2/migration_types.go
deleted file mode 100644
index 8260255d..00000000
--- a/pkg/apis/schemas/v1alpha2/migration_types.go
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
-// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.
-
-// MigrationSpec defines the desired state of Migration
-type MigrationSpec struct {
-	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
-	// Important: Run "make" to regenerate code after modifying this file
-}
-
-// MigrationStatus defines the observed state of Migration
-type MigrationStatus struct {
-	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
-	// Important: Run "make" to regenerate code after modifying this file
-}
-
-// +genclient
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// Migration is the Schema for the migrations API
-// +k8s:openapi-gen=true
-// +kubebuilder:storageversion
-type Migration struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	Spec   MigrationSpec   `json:"spec,omitempty"`
-	Status MigrationStatus `json:"status,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// MigrationList contains a list of Migration
-type MigrationList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-	Items           []Migration `json:"items"`
-}
-
-func init() {
-	SchemeBuilder.Register(&Migration{}, &MigrationList{})
-}
diff --git a/pkg/apis/schemas/v1alpha2/register.go b/pkg/apis/schemas/v1alpha2/register.go
deleted file mode 100644
index 6cca6467..00000000
--- a/pkg/apis/schemas/v1alpha2/register.go
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// NOTE: Boilerplate only.  Ignore this file.
-
-// Package v1alpha2 contains API Schema definitions for the schemas v1alpha2 API group
-// +k8s:openapi-gen=true
-// +k8s:deepcopy-gen=package,register
-// +k8s:conversion-gen=github.com/schemahero/schemahero/pkg/apis/schemas
-// +k8s:defaulter-gen=TypeMeta
-// +groupName=schemas.schemahero.io
-package v1alpha2
-
-import (
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/scheme"
-)
-
-var (
-	// SchemeGroupVersion is group version used to register these objects
-	SchemeGroupVersion = schema.GroupVersion{Group: "schemas.schemahero.io", Version: "v1alpha2"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
-
-	// AddToScheme is required by pkg/client/...
-	AddToScheme = SchemeBuilder.AddToScheme
-)
-
-// Resource is required by pkg/client/listers/...
-func Resource(resource string) schema.GroupResource {
-	return SchemeGroupVersion.WithResource(resource).GroupResource()
-}
diff --git a/pkg/apis/schemas/v1alpha2/sql.go b/pkg/apis/schemas/v1alpha2/sql.go
deleted file mode 100644
index 94fe32fb..00000000
--- a/pkg/apis/schemas/v1alpha2/sql.go
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-type SQLTableForeignKeyReferences struct {
-	Table   string   `json:"table"`
-	Columns []string `json:"columns"`
-}
-
-type SQLTableForeignKey struct {
-	Columns    []string                     `json:"columns" yaml:"columns"`
-	References SQLTableForeignKeyReferences `json:"references" yaml:"references"`
-	OnDelete   string                       `json:"onDelete,omitempty" yaml:"onDelete,omitempty"`
-	Name       string                       `json:"name,omitempty" yaml:"name,omitempty"`
-}
-
-type SQLTableIndex struct {
-	Columns  []string `json:"columns" yaml:"columns"`
-	Name     string   `json:"name,omitempty" yaml:"name,omitempty"`
-	IsUnique bool     `json:"isUnique,omitempty" yaml:"isUnique,omitempty"`
-	Type     string   `json:"type,omitempty" yaml:"type,omitempty"`
-}
-
-type SQLTableColumnConstraints struct {
-	NotNull *bool `json:"notNull,omitempty" yaml:"notNull,omitempty"`
-}
-
-type SQLTableColumn struct {
-	Name        string                     `json:"name" yaml:"name"`
-	Type        string                     `json:"type" yaml:"type"`
-	Constraints *SQLTableColumnConstraints `json:"constraints,omitempty" yaml:"constraints,omitempty"`
-	Default     *string                    `json:"default,omitempty" yaml:"default,omitempty"`
-}
-
-type SQLTableSchema struct {
-	PrimaryKey  []string              `json:"primaryKey" yaml:"primaryKey"`
-	ForeignKeys []*SQLTableForeignKey `json:"foreignKeys,omitempty" yaml:"foreignKeys,omitempty"`
-	Indexes     []*SQLTableIndex      `json:"indexes,omitempty" yaml:"indexes,omitempty"`
-	Columns     []*SQLTableColumn     `json:"columns,omitempty" yaml:"columns"`
-	IsDeleted   bool                  `json:"isDeleted,omitempty" yaml:"isDeleted,omitempty"`
-}
diff --git a/pkg/apis/schemas/v1alpha2/table_types.go b/pkg/apis/schemas/v1alpha2/table_types.go
deleted file mode 100644
index 7e2ac1fa..00000000
--- a/pkg/apis/schemas/v1alpha2/table_types.go
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-type TableSchema struct {
-	Postgres *SQLTableSchema `json:"postgres,omitempty" yaml:"postgres,omitempty"`
-	Mysql    *SQLTableSchema `json:"mysql,omitempty" yaml:"mysql,omitempty"`
-}
-
-// TableSpec defines the desired state of Table
-type TableSpec struct {
-	Database string       `json:"database" yaml:"database"`
-	Name     string       `json:"name" yaml:"name"`
-	Requires []string     `json:"requires,omitempty" yaml:"requires,omitempty"`
-	Schema   *TableSchema `json:"schema" yaml:"schema"`
-}
-
-// TableStatus defines the observed state of Table
-type TableStatus struct {
-	Plan string `json:"plan,omitempty"`
-}
-
-// +genclient
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// Table is the Schema for the tables API
-// +k8s:openapi-gen=true
-// +kubebuilder:storageversion
-type Table struct {
-	metav1.TypeMeta   `json:",inline"`
-	metav1.ObjectMeta `json:"metadata,omitempty"`
-
-	Spec   TableSpec   `json:"spec,omitempty"`
-	Status TableStatus `json:"status,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-
-// TableList contains a list of Table
-type TableList struct {
-	metav1.TypeMeta `json:",inline"`
-	metav1.ListMeta `json:"metadata,omitempty"`
-	Items           []Table `json:"items"`
-}
-
-func init() {
-	SchemeBuilder.Register(&Table{}, &TableList{})
-}
diff --git a/pkg/apis/schemas/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/schemas/v1alpha2/zz_generated.deepcopy.go
deleted file mode 100644
index cc76b2cf..00000000
--- a/pkg/apis/schemas/v1alpha2/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,376 +0,0 @@
-// +build !ignore_autogenerated
-
-// autogenerated by controller-gen object, do not modify manually
-
-package v1alpha2
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Migration) DeepCopyInto(out *Migration) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	out.Spec = in.Spec
-	out.Status = in.Status
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Migration.
-func (in *Migration) DeepCopy() *Migration {
-	if in == nil {
-		return nil
-	}
-	out := new(Migration)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Migration) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *MigrationList) DeepCopyInto(out *MigrationList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	out.ListMeta = in.ListMeta
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Migration, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MigrationList.
-func (in *MigrationList) DeepCopy() *MigrationList {
-	if in == nil {
-		return nil
-	}
-	out := new(MigrationList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *MigrationList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *MigrationSpec) DeepCopyInto(out *MigrationSpec) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MigrationSpec.
-func (in *MigrationSpec) DeepCopy() *MigrationSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(MigrationSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *MigrationStatus) DeepCopyInto(out *MigrationStatus) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MigrationStatus.
-func (in *MigrationStatus) DeepCopy() *MigrationStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(MigrationStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableColumn) DeepCopyInto(out *SQLTableColumn) {
-	*out = *in
-	if in.Constraints != nil {
-		in, out := &in.Constraints, &out.Constraints
-		*out = new(SQLTableColumnConstraints)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableColumn.
-func (in *SQLTableColumn) DeepCopy() *SQLTableColumn {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableColumn)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableColumnConstraints) DeepCopyInto(out *SQLTableColumnConstraints) {
-	*out = *in
-	if in.NotNull != nil {
-		in, out := &in.NotNull, &out.NotNull
-		*out = new(bool)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableColumnConstraints.
-func (in *SQLTableColumnConstraints) DeepCopy() *SQLTableColumnConstraints {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableColumnConstraints)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableForeignKey) DeepCopyInto(out *SQLTableForeignKey) {
-	*out = *in
-	if in.Columns != nil {
-		in, out := &in.Columns, &out.Columns
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	in.References.DeepCopyInto(&out.References)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableForeignKey.
-func (in *SQLTableForeignKey) DeepCopy() *SQLTableForeignKey {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableForeignKey)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableForeignKeyReferences) DeepCopyInto(out *SQLTableForeignKeyReferences) {
-	*out = *in
-	if in.Columns != nil {
-		in, out := &in.Columns, &out.Columns
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableForeignKeyReferences.
-func (in *SQLTableForeignKeyReferences) DeepCopy() *SQLTableForeignKeyReferences {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableForeignKeyReferences)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableIndex) DeepCopyInto(out *SQLTableIndex) {
-	*out = *in
-	if in.Columns != nil {
-		in, out := &in.Columns, &out.Columns
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableIndex.
-func (in *SQLTableIndex) DeepCopy() *SQLTableIndex {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableIndex)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *SQLTableSchema) DeepCopyInto(out *SQLTableSchema) {
-	*out = *in
-	if in.PrimaryKey != nil {
-		in, out := &in.PrimaryKey, &out.PrimaryKey
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.ForeignKeys != nil {
-		in, out := &in.ForeignKeys, &out.ForeignKeys
-		*out = make([]*SQLTableForeignKey, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(SQLTableForeignKey)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	if in.Indexes != nil {
-		in, out := &in.Indexes, &out.Indexes
-		*out = make([]*SQLTableIndex, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(SQLTableIndex)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-	if in.Columns != nil {
-		in, out := &in.Columns, &out.Columns
-		*out = make([]*SQLTableColumn, len(*in))
-		for i := range *in {
-			if (*in)[i] != nil {
-				in, out := &(*in)[i], &(*out)[i]
-				*out = new(SQLTableColumn)
-				(*in).DeepCopyInto(*out)
-			}
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SQLTableSchema.
-func (in *SQLTableSchema) DeepCopy() *SQLTableSchema {
-	if in == nil {
-		return nil
-	}
-	out := new(SQLTableSchema)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Table) DeepCopyInto(out *Table) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
-	out.Status = in.Status
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Table.
-func (in *Table) DeepCopy() *Table {
-	if in == nil {
-		return nil
-	}
-	out := new(Table)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Table) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TableList) DeepCopyInto(out *TableList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	out.ListMeta = in.ListMeta
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Table, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TableList.
-func (in *TableList) DeepCopy() *TableList {
-	if in == nil {
-		return nil
-	}
-	out := new(TableList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *TableList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TableSchema) DeepCopyInto(out *TableSchema) {
-	*out = *in
-	if in.Postgres != nil {
-		in, out := &in.Postgres, &out.Postgres
-		*out = new(SQLTableSchema)
-		(*in).DeepCopyInto(*out)
-	}
-	if in.Mysql != nil {
-		in, out := &in.Mysql, &out.Mysql
-		*out = new(SQLTableSchema)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TableSchema.
-func (in *TableSchema) DeepCopy() *TableSchema {
-	if in == nil {
-		return nil
-	}
-	out := new(TableSchema)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TableSpec) DeepCopyInto(out *TableSpec) {
-	*out = *in
-	if in.Requires != nil {
-		in, out := &in.Requires, &out.Requires
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.Schema != nil {
-		in, out := &in.Schema, &out.Schema
-		*out = new(TableSchema)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TableSpec.
-func (in *TableSpec) DeepCopy() *TableSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(TableSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TableStatus) DeepCopyInto(out *TableStatus) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TableStatus.
-func (in *TableStatus) DeepCopy() *TableStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(TableStatus)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/pkg/apis/schemas/v1alpha3/sql.go b/pkg/apis/schemas/v1alpha3/sql.go
index fd13ce99..9a4e4af2 100644
--- a/pkg/apis/schemas/v1alpha3/sql.go
+++ b/pkg/apis/schemas/v1alpha3/sql.go
@@ -16,10 +16,6 @@ limitations under the License.
 
 package v1alpha3
 
-import (
-	"github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
-)
-
 type SQLTableForeignKeyReferences struct {
 	Table   string   `json:"table"`
 	Columns []string `json:"columns"`
@@ -57,38 +53,3 @@ type SQLTableSchema struct {
 	Columns     []*SQLTableColumn     `json:"columns,omitempty" yaml:"columns"`
 	IsDeleted   bool                  `json:"isDeleted,omitempty" yaml:"isDeleted,omitempty"`
 }
-
-func (s *SQLTableSchema) fromV1Alpha2(instance *v1alpha2.SQLTableSchema) {
-	s.PrimaryKey = instance.PrimaryKey
-
-	s.ForeignKeys = []*SQLTableForeignKey{}
-	for _, fk := range instance.ForeignKeys {
-		converted := SQLTableForeignKey{
-			Columns:    fk.Columns,
-			References: SQLTableForeignKeyReferences(fk.References),
-			OnDelete:   fk.OnDelete,
-			Name:       fk.Name,
-		}
-		s.ForeignKeys = append(s.ForeignKeys, &converted)
-	}
-
-	s.Indexes = []*SQLTableIndex{}
-	for _, idx := range instance.Indexes {
-		converted := SQLTableIndex(*idx)
-		s.Indexes = append(s.Indexes, &converted)
-	}
-
-	s.Columns = []*SQLTableColumn{}
-	for _, col := range instance.Columns {
-		converted := SQLTableColumn{
-			Name:    col.Name,
-			Type:    col.Type,
-			Default: col.Default,
-		}
-
-		if col.Constraints != nil {
-			constraints := SQLTableColumnConstraints(*col.Constraints)
-			converted.Constraints = &constraints
-		}
-	}
-}
diff --git a/pkg/controller/database/database_controller.go b/pkg/controller/database/database_controller.go
index 42d8ce51..c28af725 100644
--- a/pkg/controller/database/database_controller.go
+++ b/pkg/controller/database/database_controller.go
@@ -22,7 +22,6 @@ import (
 	"fmt"
 
 	"github.com/pkg/errors"
-	databasesv1alpha2 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha2"
 	databasesv1alpha3 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/logger"
 	"go.uber.org/zap"
@@ -58,11 +57,6 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
 	}
 
 	// Watch for changes to Database kinds
-	err = c.Watch(&source.Kind{Type: &databasesv1alpha2.Database{}}, &handler.EnqueueRequestForObject{})
-	if err != nil {
-		return err
-	}
-
 	err = c.Watch(&source.Kind{Type: &databasesv1alpha3.Database{}}, &handler.EnqueueRequestForObject{})
 	if err != nil {
 		return err
@@ -114,14 +108,8 @@ func (r *ReconcileDatabase) Reconcile(request reconcile.Request) (reconcile.Resu
 }
 
 func (r *ReconcileDatabase) getInstance(request reconcile.Request) (*databasesv1alpha3.Database, error) {
-	v1alpha2instance := &databasesv1alpha2.Database{}
-	err := r.Get(context.Background(), request.NamespacedName, v1alpha2instance)
-	if err == nil {
-		return databasesv1alpha3.ConvertFromV1Alpha2(v1alpha2instance), nil
-	}
-
 	instance := &databasesv1alpha3.Database{}
-	err = r.Get(context.Background(), request.NamespacedName, instance)
+	err := r.Get(context.Background(), request.NamespacedName, instance)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get databasesv1alpha3 instance")
 	}
diff --git a/pkg/database/database.go b/pkg/database/database.go
index ef945bd9..c118feb1 100644
--- a/pkg/database/database.go
+++ b/pkg/database/database.go
@@ -8,7 +8,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/mysql"
 	"github.com/schemahero/schemahero/pkg/database/postgres"
 	"github.com/spf13/viper"
@@ -43,9 +43,9 @@ func (d *Database) CreateFixturesSync() error {
 			return err
 		}
 
-		var spec *schemasv1alpha2.TableSpec
+		var spec *schemasv1alpha3.TableSpec
 
-		parsedK8sObject := schemasv1alpha2.Table{}
+		parsedK8sObject := schemasv1alpha3.Table{}
 		if err := yaml.Unmarshal(fileData, &parsedK8sObject); err == nil {
 			if parsedK8sObject.Spec.Schema != nil {
 				spec = &parsedK8sObject.Spec
@@ -53,7 +53,7 @@ func (d *Database) CreateFixturesSync() error {
 		}
 
 		if spec == nil {
-			plainSpec := schemasv1alpha2.TableSpec{}
+			plainSpec := schemasv1alpha3.TableSpec{}
 			if err := yaml.Unmarshal(fileData, &plainSpec); err != nil {
 				return err
 			}
@@ -121,8 +121,8 @@ func (d *Database) PlanSync(filename string) error {
 		return err
 	}
 
-	var spec *schemasv1alpha2.TableSpec
-	parsedK8sObject := schemasv1alpha2.Table{}
+	var spec *schemasv1alpha3.TableSpec
+	parsedK8sObject := schemasv1alpha3.Table{}
 	if err := yaml.Unmarshal(specContents, &parsedK8sObject); err == nil {
 		if parsedK8sObject.Spec.Schema != nil {
 			spec = &parsedK8sObject.Spec
@@ -130,7 +130,7 @@ func (d *Database) PlanSync(filename string) error {
 	}
 
 	if spec == nil {
-		plainSpec := schemasv1alpha2.TableSpec{}
+		plainSpec := schemasv1alpha3.TableSpec{}
 		if err := yaml.Unmarshal(specContents, &plainSpec); err != nil {
 			return err
 		}
diff --git a/pkg/database/mysql/alter.go b/pkg/database/mysql/alter.go
index 5e60b4a9..b1d73622 100644
--- a/pkg/database/mysql/alter.go
+++ b/pkg/database/mysql/alter.go
@@ -1,11 +1,11 @@
 package mysql
 
 import (
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func AlterColumnStatement(tableName string, primaryKeys []string, desiredColumns []*schemasv1alpha2.SQLTableColumn, existingColumn *types.Column) (string, error) {
+func AlterColumnStatement(tableName string, primaryKeys []string, desiredColumns []*schemasv1alpha3.SQLTableColumn, existingColumn *types.Column) (string, error) {
 	// this could be an alter or a drop column command
 	for _, desiredColumn := range desiredColumns {
 		if desiredColumn.Name == existingColumn.Name {
diff --git a/pkg/database/mysql/column.go b/pkg/database/mysql/column.go
index 54455fcf..a378a8c3 100644
--- a/pkg/database/mysql/column.go
+++ b/pkg/database/mysql/column.go
@@ -3,11 +3,11 @@ package mysql
 import (
 	"fmt"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func schemaColumnToColumn(schemaColumn *schemasv1alpha2.SQLTableColumn) (*types.Column, error) {
+func schemaColumnToColumn(schemaColumn *schemasv1alpha3.SQLTableColumn) (*types.Column, error) {
 	column := &types.Column{
 		Name:          schemaColumn.Name,
 		ColumnDefault: schemaColumn.Default,
@@ -48,7 +48,7 @@ func schemaColumnToColumn(schemaColumn *schemasv1alpha2.SQLTableColumn) (*types.
 	return nil, fmt.Errorf("unknown column type. cannot validate column type %q", schemaColumn.Type)
 }
 
-func mysqlColumnAsInsert(column *schemasv1alpha2.SQLTableColumn) (string, error) {
+func mysqlColumnAsInsert(column *schemasv1alpha3.SQLTableColumn) (string, error) {
 	mysqlColumn, err := schemaColumnToColumn(column)
 	if err != nil {
 		return "", err
@@ -71,7 +71,7 @@ func mysqlColumnAsInsert(column *schemasv1alpha2.SQLTableColumn) (string, error)
 	return formatted, nil
 }
 
-func InsertColumnStatement(tableName string, desiredColumn *schemasv1alpha2.SQLTableColumn) (string, error) {
+func InsertColumnStatement(tableName string, desiredColumn *schemasv1alpha3.SQLTableColumn) (string, error) {
 	columnFields, err := mysqlColumnAsInsert(desiredColumn)
 	if err != nil {
 		return "", err
diff --git a/pkg/database/mysql/create.go b/pkg/database/mysql/create.go
index 823f8841..d89ad53c 100644
--- a/pkg/database/mysql/create.go
+++ b/pkg/database/mysql/create.go
@@ -4,10 +4,10 @@ import (
 	"fmt"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 )
 
-func CreateTableStatement(tableName string, tableSchema *schemasv1alpha2.SQLTableSchema) (string, error) {
+func CreateTableStatement(tableName string, tableSchema *schemasv1alpha3.SQLTableSchema) (string, error) {
 	columns := []string{}
 	for _, desiredColumn := range tableSchema.Columns {
 		columnFields, err := mysqlColumnAsInsert(desiredColumn)
diff --git a/pkg/database/mysql/deploy.go b/pkg/database/mysql/deploy.go
index df41d346..3d70e04a 100644
--- a/pkg/database/mysql/deploy.go
+++ b/pkg/database/mysql/deploy.go
@@ -5,11 +5,11 @@ import (
 	"database/sql"
 	"fmt"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func PlanMysqlTable(uri string, tableName string, mysqlTableSchema *schemasv1alpha2.SQLTableSchema) error {
+func PlanMysqlTable(uri string, tableName string, mysqlTableSchema *schemasv1alpha3.SQLTableSchema) error {
 	m, err := Connect(uri)
 	if err != nil {
 		return err
@@ -105,7 +105,7 @@ func executeStatements(m *MysqlConnection, statements []string) error {
 	return nil
 }
 
-func buildColumnStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildColumnStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	query := `select
 		COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
 		from information_schema.COLUMNS
@@ -183,7 +183,7 @@ func buildColumnStatements(m *MysqlConnection, tableName string, mysqlTableSchem
 	return alterAndDropStatements, nil
 }
 
-func buildPrimaryKeyStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildPrimaryKeyStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	currentPrimaryKey, err := m.GetTablePrimaryKey(tableName)
 	if err != nil {
 		return nil, err
@@ -218,7 +218,7 @@ func buildPrimaryKeyStatements(m *MysqlConnection, tableName string, mysqlTableS
 	return statements, nil
 }
 
-func buildForeignKeyStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildForeignKeyStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	foreignKeyStatements := []string{}
 	currentForeignKeys, err := m.ListTableForeignKeys(m.databaseName, tableName)
 	if err != nil {
@@ -266,7 +266,7 @@ func buildForeignKeyStatements(m *MysqlConnection, tableName string, mysqlTableS
 	return foreignKeyStatements, nil
 }
 
-func buildIndexStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildIndexStatements(m *MysqlConnection, tableName string, mysqlTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	indexStatements := []string{}
 	currentIndexes, err := m.ListTableIndexes(m.databaseName, tableName)
 	if err != nil {
diff --git a/pkg/database/mysql/foreignkey.go b/pkg/database/mysql/foreignkey.go
index 55304130..b7fb98d1 100644
--- a/pkg/database/mysql/foreignkey.go
+++ b/pkg/database/mysql/foreignkey.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
@@ -12,11 +12,11 @@ func RemoveForeignKeyStatement(tableName string, foreignKey *types.ForeignKey) s
 	return fmt.Sprintf("alter table %s drop constraint %s", tableName, foreignKey.Name)
 }
 
-func AddForeignKeyStatement(tableName string, schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) string {
+func AddForeignKeyStatement(tableName string, schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) string {
 	return fmt.Sprintf("alter table %s add %s", tableName, foreignKeyConstraintClause(tableName, schemaForeignKey))
 }
 
-func foreignKeyConstraintClause(tableName string, schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) string {
+func foreignKeyConstraintClause(tableName string, schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) string {
 	onDelete := ""
 	if schemaForeignKey.OnDelete != "" {
 		onDelete = fmt.Sprintf(" on delete %s", schemaForeignKey.OnDelete)
diff --git a/pkg/database/mysql/index.go b/pkg/database/mysql/index.go
index 1a02a963..b2835dde 100644
--- a/pkg/database/mysql/index.go
+++ b/pkg/database/mysql/index.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
@@ -12,7 +12,7 @@ func RemoveIndexStatement(tableName string, index *types.Index) string {
 	return fmt.Sprintf("alter table %q drop index %q", tableName, index.Name)
 }
 
-func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha2.SQLTableIndex) string {
+func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha3.SQLTableIndex) string {
 	unique := ""
 	if schemaIndex.IsUnique {
 		unique = "unique "
@@ -26,6 +26,6 @@ func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha2.SQLTableIn
 	return fmt.Sprintf("create %sindex %s on %s (%s)", unique, name, tableName, strings.Join(schemaIndex.Columns, ", "))
 }
 
-func RenameIndexStatement(tableName string, index *types.Index, schemaIndex *schemasv1alpha2.SQLTableIndex) string {
+func RenameIndexStatement(tableName string, index *types.Index, schemaIndex *schemasv1alpha3.SQLTableIndex) string {
 	return fmt.Sprintf("alter index %s rename to %s", index.Name, schemaIndex.Name)
 }
diff --git a/pkg/database/postgres/alter.go b/pkg/database/postgres/alter.go
index 2e841522..9a1b4f9f 100644
--- a/pkg/database/postgres/alter.go
+++ b/pkg/database/postgres/alter.go
@@ -6,11 +6,11 @@ import (
 
 	"github.com/lib/pq"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func AlterColumnStatement(tableName string, primaryKeys []string, desiredColumns []*schemasv1alpha2.SQLTableColumn, existingColumn *types.Column) (string, error) {
+func AlterColumnStatement(tableName string, primaryKeys []string, desiredColumns []*schemasv1alpha3.SQLTableColumn, existingColumn *types.Column) (string, error) {
 	alterStatement := fmt.Sprintf("alter column %s", pq.QuoteIdentifier(existingColumn.Name))
 
 	// this could be an alter or a drop column command
diff --git a/pkg/database/postgres/column.go b/pkg/database/postgres/column.go
index e6995df6..09f36ff5 100644
--- a/pkg/database/postgres/column.go
+++ b/pkg/database/postgres/column.go
@@ -5,11 +5,11 @@ import (
 	"strings"
 
 	"github.com/lib/pq"
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func schemaColumnToColumn(schemaColumn *schemasv1alpha2.SQLTableColumn) (*types.Column, error) {
+func schemaColumnToColumn(schemaColumn *schemasv1alpha3.SQLTableColumn) (*types.Column, error) {
 	column := &types.Column{
 		Name:          schemaColumn.Name,
 		ColumnDefault: schemaColumn.Default,
@@ -56,7 +56,7 @@ func schemaColumnToColumn(schemaColumn *schemasv1alpha2.SQLTableColumn) (*types.
 	return nil, fmt.Errorf("unknown column type. cannot validate column type %q", schemaColumn.Type)
 }
 
-func postgresColumnAsInsert(column *schemasv1alpha2.SQLTableColumn) (string, error) {
+func postgresColumnAsInsert(column *schemasv1alpha3.SQLTableColumn) (string, error) {
 	// Note, we don't always quote the column type because of how pg handles these two statement very differently:
 
 	// 1. create table "users" ("id" "bigint","login" "varchar(255)","name" "varchar(255)")
@@ -91,7 +91,7 @@ func postgresColumnAsInsert(column *schemasv1alpha2.SQLTableColumn) (string, err
 	return formatted, nil
 }
 
-func InsertColumnStatement(tableName string, desiredColumn *schemasv1alpha2.SQLTableColumn) (string, error) {
+func InsertColumnStatement(tableName string, desiredColumn *schemasv1alpha3.SQLTableColumn) (string, error) {
 	columnFields, err := postgresColumnAsInsert(desiredColumn)
 	if err != nil {
 		return "", err
diff --git a/pkg/database/postgres/create.go b/pkg/database/postgres/create.go
index f531898e..538a2273 100644
--- a/pkg/database/postgres/create.go
+++ b/pkg/database/postgres/create.go
@@ -6,11 +6,11 @@ import (
 
 	"github.com/lib/pq"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func CreateTableStatement(tableName string, tableSchema *schemasv1alpha2.SQLTableSchema) (string, error) {
+func CreateTableStatement(tableName string, tableSchema *schemasv1alpha3.SQLTableSchema) (string, error) {
 	columns := []string{}
 	for _, desiredColumn := range tableSchema.Columns {
 		columnFields, err := postgresColumnAsInsert(desiredColumn)
diff --git a/pkg/database/postgres/deploy.go b/pkg/database/postgres/deploy.go
index 282caaa7..03f2ec04 100644
--- a/pkg/database/postgres/deploy.go
+++ b/pkg/database/postgres/deploy.go
@@ -6,11 +6,11 @@ import (
 	"fmt"
 
 	"github.com/pkg/errors"
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
-func PlanPostgresTable(uri string, tableName string, postgresTableSchema *schemasv1alpha2.SQLTableSchema) error {
+func PlanPostgresTable(uri string, tableName string, postgresTableSchema *schemasv1alpha3.SQLTableSchema) error {
 	p, err := Connect(uri)
 	if err != nil {
 		return err
@@ -105,7 +105,7 @@ func executeStatements(p *PostgresConnection, statements []string) error {
 	return nil
 }
 
-func buildColumnStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildColumnStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	query := `select
 		column_name, column_default, is_nullable, data_type, character_maximum_length
 		from information_schema.columns
@@ -177,7 +177,7 @@ func buildColumnStatements(p *PostgresConnection, tableName string, postgresTabl
 	return alterAndDropStatements, nil
 }
 
-func buildPrimaryKeyStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildPrimaryKeyStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	currentPrimaryKey, err := p.GetTablePrimaryKey(tableName)
 	if err != nil {
 		return nil, err
@@ -206,7 +206,7 @@ func buildPrimaryKeyStatements(p *PostgresConnection, tableName string, postgres
 	return statements, nil
 }
 
-func buildForeignKeyStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildForeignKeyStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	foreignKeyStatements := []string{}
 	droppedKeys := []string{}
 	currentForeignKeys, err := p.ListTableForeignKeys(p.databaseName, tableName)
@@ -262,7 +262,7 @@ func buildForeignKeyStatements(p *PostgresConnection, tableName string, postgres
 	return foreignKeyStatements, nil
 }
 
-func buildIndexStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha2.SQLTableSchema) ([]string, error) {
+func buildIndexStatements(p *PostgresConnection, tableName string, postgresTableSchema *schemasv1alpha3.SQLTableSchema) ([]string, error) {
 	indexStatements := []string{}
 	droppedIndexes := []string{}
 	currentIndexes, err := p.ListTableIndexes(p.databaseName, tableName)
diff --git a/pkg/database/postgres/foreignkey.go b/pkg/database/postgres/foreignkey.go
index 27ce44fc..de65607f 100644
--- a/pkg/database/postgres/foreignkey.go
+++ b/pkg/database/postgres/foreignkey.go
@@ -5,7 +5,7 @@ import (
 	"strings"
 
 	"github.com/lib/pq"
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
@@ -13,11 +13,11 @@ func RemoveForeignKeyStatement(tableName string, foreignKey *types.ForeignKey) s
 	return fmt.Sprintf("alter table %s drop constraint %s", tableName, pq.QuoteIdentifier(foreignKey.Name))
 }
 
-func AddForeignKeyStatement(tableName string, schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) string {
+func AddForeignKeyStatement(tableName string, schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) string {
 	return fmt.Sprintf("alter table %s add %s", tableName, foreignKeyConstraintClause(tableName, schemaForeignKey))
 }
 
-func foreignKeyConstraintClause(tableName string, schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) string {
+func foreignKeyConstraintClause(tableName string, schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) string {
 	onDelete := ""
 	if schemaForeignKey.OnDelete != "" {
 		onDelete = fmt.Sprintf(" on delete %s", schemaForeignKey.OnDelete)
diff --git a/pkg/database/postgres/index.go b/pkg/database/postgres/index.go
index 6ad0bff1..af3c3e2e 100644
--- a/pkg/database/postgres/index.go
+++ b/pkg/database/postgres/index.go
@@ -5,7 +5,7 @@ import (
 	"strings"
 
 	"github.com/lib/pq"
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 )
 
@@ -20,7 +20,7 @@ func RemoveIndexStatement(tableName string, index *types.Index) string {
 	return fmt.Sprintf("drop index %s", pq.QuoteIdentifier(index.Name))
 }
 
-func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha2.SQLTableIndex) string {
+func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha3.SQLTableIndex) string {
 	unique := ""
 	if schemaIndex.IsUnique {
 		unique = "unique "
@@ -38,6 +38,6 @@ func AddIndexStatement(tableName string, schemaIndex *schemasv1alpha2.SQLTableIn
 		strings.Join(schemaIndex.Columns, ", "))
 }
 
-func RenameIndexStatement(tableName string, index *types.Index, schemaIndex *schemasv1alpha2.SQLTableIndex) string {
+func RenameIndexStatement(tableName string, index *types.Index, schemaIndex *schemasv1alpha3.SQLTableIndex) string {
 	return fmt.Sprintf("alter index %s rename to %s", pq.QuoteIdentifier(index.Name), pq.QuoteIdentifier(schemaIndex.Name))
 }
diff --git a/pkg/database/types/column.go b/pkg/database/types/column.go
index a5eebd83..0b1eaded 100644
--- a/pkg/database/types/column.go
+++ b/pkg/database/types/column.go
@@ -1,7 +1,7 @@
 package types
 
 import (
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 )
 
 type ColumnConstraints struct {
@@ -23,14 +23,14 @@ type Column struct {
 	IsArray       bool
 }
 
-func ColumnToSchemaColumn(column *Column) (*schemasv1alpha2.SQLTableColumn, error) {
-	schemaColumn := &schemasv1alpha2.SQLTableColumn{
+func ColumnToSchemaColumn(column *Column) (*schemasv1alpha3.SQLTableColumn, error) {
+	schemaColumn := &schemasv1alpha3.SQLTableColumn{
 		Name: column.Name,
 		Type: column.DataType,
 	}
 
 	if column.Constraints != nil {
-		schemaColumn.Constraints = &schemasv1alpha2.SQLTableColumnConstraints{
+		schemaColumn.Constraints = &schemasv1alpha3.SQLTableColumnConstraints{
 			NotNull: column.Constraints.NotNull,
 		}
 	}
diff --git a/pkg/database/types/foreignkey.go b/pkg/database/types/foreignkey.go
index cbf5914e..35e20823 100644
--- a/pkg/database/types/foreignkey.go
+++ b/pkg/database/types/foreignkey.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 )
 
 type ForeignKey struct {
@@ -21,10 +21,10 @@ func (fk *ForeignKey) Equals(other *ForeignKey) bool {
 	return false
 }
 
-func ForeignKeyToSchemaForeignKey(foreignKey *ForeignKey) *schemasv1alpha2.SQLTableForeignKey {
-	schemaForeignKey := schemasv1alpha2.SQLTableForeignKey{
+func ForeignKeyToSchemaForeignKey(foreignKey *ForeignKey) *schemasv1alpha3.SQLTableForeignKey {
+	schemaForeignKey := schemasv1alpha3.SQLTableForeignKey{
 		Columns: foreignKey.ChildColumns,
-		References: schemasv1alpha2.SQLTableForeignKeyReferences{
+		References: schemasv1alpha3.SQLTableForeignKeyReferences{
 			Table:   foreignKey.ParentTable,
 			Columns: foreignKey.ParentColumns,
 		},
@@ -35,7 +35,7 @@ func ForeignKeyToSchemaForeignKey(foreignKey *ForeignKey) *schemasv1alpha2.SQLTa
 	return &schemaForeignKey
 }
 
-func SchemaForeignKeyToForeignKey(schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) *ForeignKey {
+func SchemaForeignKeyToForeignKey(schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) *ForeignKey {
 	foreignKey := ForeignKey{
 		ChildColumns:  schemaForeignKey.Columns,
 		ParentTable:   schemaForeignKey.References.Table,
@@ -47,7 +47,7 @@ func SchemaForeignKeyToForeignKey(schemaForeignKey *schemasv1alpha2.SQLTableFore
 	return &foreignKey
 }
 
-func GenerateFKName(tableName string, schemaForeignKey *schemasv1alpha2.SQLTableForeignKey) string {
+func GenerateFKName(tableName string, schemaForeignKey *schemasv1alpha3.SQLTableForeignKey) string {
 	if schemaForeignKey.Name != "" {
 		return schemaForeignKey.Name
 	}
diff --git a/pkg/database/types/index.go b/pkg/database/types/index.go
index 366771d4..b9d8d42b 100644
--- a/pkg/database/types/index.go
+++ b/pkg/database/types/index.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 )
 
 type Index struct {
@@ -41,8 +41,8 @@ func (idx *Index) Equals(other *Index) bool {
 	return true
 }
 
-func IndexToSchemaIndex(index *Index) *schemasv1alpha2.SQLTableIndex {
-	schemaIndex := schemasv1alpha2.SQLTableIndex{
+func IndexToSchemaIndex(index *Index) *schemasv1alpha3.SQLTableIndex {
+	schemaIndex := schemasv1alpha3.SQLTableIndex{
 		Columns:  index.Columns,
 		Name:     index.Name,
 		IsUnique: index.IsUnique,
@@ -51,7 +51,7 @@ func IndexToSchemaIndex(index *Index) *schemasv1alpha2.SQLTableIndex {
 	return &schemaIndex
 }
 
-func SchemaIndexToIndex(schemaIndex *schemasv1alpha2.SQLTableIndex) *Index {
+func SchemaIndexToIndex(schemaIndex *schemasv1alpha3.SQLTableIndex) *Index {
 	index := Index{
 		Columns:  schemaIndex.Columns,
 		Name:     schemaIndex.Name,
@@ -61,6 +61,6 @@ func SchemaIndexToIndex(schemaIndex *schemasv1alpha2.SQLTableIndex) *Index {
 	return &index
 }
 
-func GenerateIndexName(tableName string, schemaIndex *schemasv1alpha2.SQLTableIndex) string {
+func GenerateIndexName(tableName string, schemaIndex *schemasv1alpha3.SQLTableIndex) string {
 	return fmt.Sprintf("idx_%s_%s", tableName, strings.Join(schemaIndex.Columns, "_"))
 }
diff --git a/pkg/generate/generate.go b/pkg/generate/generate.go
index f38d284d..621fa6aa 100644
--- a/pkg/generate/generate.go
+++ b/pkg/generate/generate.go
@@ -6,7 +6,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/interfaces"
 	"github.com/schemahero/schemahero/pkg/database/mysql"
 	"github.com/schemahero/schemahero/pkg/database/postgres"
@@ -120,19 +120,19 @@ func (g *Generator) RunSync() error {
 }
 
 func generateTableYAML(driver string, dbName string, tableName string, primaryKey []string, foreignKeys []*types.ForeignKey, indexes []*types.Index, columns []*types.Column) (string, error) {
-	schemaForeignKeys := make([]*schemasv1alpha2.SQLTableForeignKey, 0, 0)
+	schemaForeignKeys := make([]*schemasv1alpha3.SQLTableForeignKey, 0, 0)
 	for _, foreignKey := range foreignKeys {
 		schemaForeignKey := types.ForeignKeyToSchemaForeignKey(foreignKey)
 		schemaForeignKeys = append(schemaForeignKeys, schemaForeignKey)
 	}
 
-	schemaIndexes := make([]*schemasv1alpha2.SQLTableIndex, 0, 0)
+	schemaIndexes := make([]*schemasv1alpha3.SQLTableIndex, 0, 0)
 	for _, index := range indexes {
 		schemaIndex := types.IndexToSchemaIndex(index)
 		schemaIndexes = append(schemaIndexes, schemaIndex)
 	}
 
-	schemaTableColumns := make([]*schemasv1alpha2.SQLTableColumn, 0, 0)
+	schemaTableColumns := make([]*schemasv1alpha3.SQLTableColumn, 0, 0)
 	for _, column := range columns {
 		schemaTableColumn, err := types.ColumnToSchemaColumn(column)
 		if err != nil {
@@ -143,14 +143,14 @@ func generateTableYAML(driver string, dbName string, tableName string, primaryKe
 		schemaTableColumns = append(schemaTableColumns, schemaTableColumn)
 	}
 
-	tableSchema := &schemasv1alpha2.SQLTableSchema{
+	tableSchema := &schemasv1alpha3.SQLTableSchema{
 		PrimaryKey:  primaryKey,
 		Columns:     schemaTableColumns,
 		ForeignKeys: schemaForeignKeys,
 		Indexes:     schemaIndexes,
 	}
 
-	schema := &schemasv1alpha2.TableSchema{}
+	schema := &schemasv1alpha3.TableSchema{}
 
 	if driver == "postgres" {
 		schema.Postgres = tableSchema
@@ -158,7 +158,7 @@ func generateTableYAML(driver string, dbName string, tableName string, primaryKe
 		schema.Mysql = tableSchema
 	}
 
-	schemaHeroResource := schemasv1alpha2.TableSpec{
+	schemaHeroResource := schemasv1alpha3.TableSpec{
 		Database: dbName,
 		Name:     tableName,
 		Requires: []string{},
@@ -166,7 +166,7 @@ func generateTableYAML(driver string, dbName string, tableName string, primaryKe
 	}
 
 	specDoc := struct {
-		Spec schemasv1alpha2.TableSpec `yaml:"spec"`
+		Spec schemasv1alpha3.TableSpec `yaml:"spec"`
 	}{
 		schemaHeroResource,
 	}
@@ -178,7 +178,7 @@ func generateTableYAML(driver string, dbName string, tableName string, primaryKe
 	}
 
 	// TODO consider marshaling this instead of inline
-	tableDoc := fmt.Sprintf(`apiVersion: schemas.schemahero.io/v1alpha2
+	tableDoc := fmt.Sprintf(`apiVersion: schemas.schemahero.io/v1alpha3
 kind: Table
 metadata:
   name: %s
diff --git a/pkg/installer/databases.go b/pkg/installer/databases.go
index a1ceb56b..a1e533ab 100644
--- a/pkg/installer/databases.go
+++ b/pkg/installer/databases.go
@@ -49,7 +49,7 @@ func databasesCRD() *extensionsv1.CustomResourceDefinition {
 			Name: "databases.databases.schemahero.io",
 		},
 		Status: extensionsv1.CustomResourceDefinitionStatus{
-			StoredVersions: []string{},
+			StoredVersions: []string{"v1alpha3"},
 			Conditions:     []extensionsv1.CustomResourceDefinitionCondition{},
 			AcceptedNames: extensionsv1.CustomResourceDefinitionNames{
 				Kind:   "",
diff --git a/pkg/installer/manager.go b/pkg/installer/manager.go
index 0ddec0ec..0925df7d 100644
--- a/pkg/installer/manager.go
+++ b/pkg/installer/manager.go
@@ -211,8 +211,8 @@ func manager() *appsv1.StatefulSet {
 					},
 					Containers: []corev1.Container{
 						{
-							Image:           "schemahero/schemahero-manager:latest",
-							ImagePullPolicy: corev1.PullIfNotPresent,
+							Image:           "schemahero/schemahero-manager:0.8.0-alpha",
+							ImagePullPolicy: corev1.PullAlways,
 							Name:            "manager",
 							Command:         []string{"/manager"},
 							Env: []corev1.EnvVar{
@@ -232,11 +232,11 @@ func manager() *appsv1.StatefulSet {
 							Resources: corev1.ResourceRequirements{
 								Limits: corev1.ResourceList{
 									corev1.ResourceCPU:    resource.MustParse("1"),
-									corev1.ResourceMemory: resource.MustParse("150m"),
+									corev1.ResourceMemory: resource.MustParse("150Mi"),
 								},
 								Requests: corev1.ResourceList{
 									corev1.ResourceCPU:    resource.MustParse("100m"),
-									corev1.ResourceMemory: resource.MustParse("50m"),
+									corev1.ResourceMemory: resource.MustParse("50Mi"),
 								},
 							},
 							Ports: []corev1.ContainerPort{
diff --git a/pkg/installer/migrations.go b/pkg/installer/migrations.go
index 802d41b8..94d7bb1a 100644
--- a/pkg/installer/migrations.go
+++ b/pkg/installer/migrations.go
@@ -49,7 +49,7 @@ func migrationsCRD() *extensionsv1.CustomResourceDefinition {
 			Name: "migrations.schemas.schemahero.io",
 		},
 		Status: extensionsv1.CustomResourceDefinitionStatus{
-			StoredVersions: []string{},
+			StoredVersions: []string{"v1alpha3"},
 			Conditions:     []extensionsv1.CustomResourceDefinitionCondition{},
 			AcceptedNames: extensionsv1.CustomResourceDefinitionNames{
 				Kind:   "",
diff --git a/pkg/installer/tables.go b/pkg/installer/tables.go
index c670ef41..c63ae06e 100644
--- a/pkg/installer/tables.go
+++ b/pkg/installer/tables.go
@@ -49,7 +49,7 @@ func tablesCRD() *extensionsv1.CustomResourceDefinition {
 			Name: "tables.schemas.schemahero.io",
 		},
 		Status: extensionsv1.CustomResourceDefinitionStatus{
-			StoredVersions: []string{},
+			StoredVersions: []string{"v1alpha3"},
 			Conditions:     []extensionsv1.CustomResourceDefinitionCondition{},
 			AcceptedNames: extensionsv1.CustomResourceDefinitionNames{
 				Kind:   "",


Test patch:
diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml
index 30d704d0..62c05482 100644
--- a/.github/workflows/build-and-test.yaml
+++ b/.github/workflows/build-and-test.yaml
@@ -1,8 +1,5 @@
 name: "Build and test"
-on:
-  push:
-    branches-ignore: [master] # master branch runs alpha-release workflow
-    tags-ignore: ["*"] # tags run tagged-release workflow
+on: [push]
 
 jobs:
   build:
diff --git a/pkg/apis/databases/v1alpha2/mysql_types_test.go b/pkg/apis/databases/v1alpha2/mysql_types_test.go
deleted file mode 100644
index ec17fdcc..00000000
--- a/pkg/apis/databases/v1alpha2/mysql_types_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"gopkg.in/yaml.v2"
-)
-
-func TestUnmarshalMysqlSpec(t *testing.T) {
-	manifest := `
-uri:
-    value: baz`
-
-	g := gomega.NewGomegaWithT(t)
-
-	m := MysqlConnection{}
-	err := yaml.Unmarshal([]byte(manifest), &m)
-	g.Expect(err).NotTo(gomega.HaveOccurred())
-	g.Expect(m.URI.Value).To(gomega.Equal("baz"))
-}
diff --git a/pkg/apis/databases/v1alpha2/postgres_types_test.go b/pkg/apis/databases/v1alpha2/postgres_types_test.go
deleted file mode 100644
index d056f0a6..00000000
--- a/pkg/apis/databases/v1alpha2/postgres_types_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"gopkg.in/yaml.v2"
-)
-
-func TestUnmarshalPostgresSpec(t *testing.T) {
-	manifest := `
-uri:
-    value: baz`
-
-	g := gomega.NewGomegaWithT(t)
-
-	p := PostgresConnection{}
-	err := yaml.Unmarshal([]byte(manifest), &p)
-	g.Expect(err).NotTo(gomega.HaveOccurred())
-	g.Expect(p.URI.Value).To(gomega.Equal("baz"))
-}
diff --git a/pkg/apis/databases/v1alpha2/string_or_value_test.go b/pkg/apis/databases/v1alpha2/string_or_value_test.go
deleted file mode 100644
index ceae8929..00000000
--- a/pkg/apis/databases/v1alpha2/string_or_value_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"gopkg.in/yaml.v2"
-)
-
-func TestUnmarshalInlineOrRef(t *testing.T) {
-	g := gomega.NewGomegaWithT(t)
-
-	type testStruct struct {
-		Test InlineOrRef `json:"test"`
-	}
-
-	inlineYAML := `test: "test"`
-	var inline testStruct
-	err := yaml.Unmarshal([]byte(inlineYAML), &inline)
-	g.Expect(err).NotTo(gomega.HaveOccurred())
-	g.Expect(inline.Test.Value).To(gomega.Equal("test"))
-	g.Expect(inline.Test.ValueFrom).To(gomega.BeNil())
-
-	secretYAML := `test:
-  valueFrom:
-    secretKeyRef:
-      name: secretName
-      key: secretKey`
-	var secret testStruct
-	err = yaml.Unmarshal([]byte(secretYAML), &secret)
-	g.Expect(err).NotTo(gomega.HaveOccurred())
-	g.Expect(secret.Test.Value).To(gomega.Equal(""))
-	g.Expect(secret.Test.ValueFrom).ToNot(gomega.BeNil())
-	g.Expect(secret.Test.ValueFrom.SecretKeyRef).ToNot(gomega.BeNil())
-	g.Expect(secret.Test.ValueFrom.SecretKeyRef.Name).To(gomega.Equal("secretName"))
-	g.Expect(secret.Test.ValueFrom.SecretKeyRef.Key).To(gomega.Equal("secretKey"))
-}
diff --git a/pkg/apis/databases/v1alpha2/v1alpha1_suite_test.go b/pkg/apis/databases/v1alpha2/v1alpha1_suite_test.go
deleted file mode 100644
index 8b415045..00000000
--- a/pkg/apis/databases/v1alpha2/v1alpha1_suite_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"log"
-	"os"
-	"path/filepath"
-	"testing"
-
-	"k8s.io/client-go/kubernetes/scheme"
-	"k8s.io/client-go/rest"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/envtest"
-)
-
-var cfg *rest.Config
-var c client.Client
-
-func TestMain(m *testing.M) {
-	t := &envtest.Environment{
-		CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "..", "config", "crds")},
-	}
-
-	err := SchemeBuilder.AddToScheme(scheme.Scheme)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	if cfg, err = t.Start(); err != nil {
-		log.Fatal(err)
-	}
-
-	if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {
-		log.Fatal(err)
-	}
-
-	code := m.Run()
-	t.Stop()
-	os.Exit(code)
-}
diff --git a/pkg/apis/schemas/v1alpha2/migration_types_test.go b/pkg/apis/schemas/v1alpha2/migration_types_test.go
deleted file mode 100644
index 81888461..00000000
--- a/pkg/apis/schemas/v1alpha2/migration_types_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"golang.org/x/net/context"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/types"
-)
-
-func TestStorageMigration(t *testing.T) {
-	key := types.NamespacedName{
-		Name:      "foo",
-		Namespace: "default",
-	}
-	created := &Migration{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "foo",
-			Namespace: "default",
-		}}
-	g := gomega.NewGomegaWithT(t)
-
-	// Test Create
-	fetched := &Migration{}
-	g.Expect(c.Create(context.TODO(), created)).NotTo(gomega.HaveOccurred())
-
-	g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(fetched).To(gomega.Equal(created))
-
-	// Test Updating the Labels
-	updated := fetched.DeepCopy()
-	updated.Labels = map[string]string{"hello": "world"}
-	g.Expect(c.Update(context.TODO(), updated)).NotTo(gomega.HaveOccurred())
-
-	g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(fetched).To(gomega.Equal(updated))
-
-	// Test Delete
-	g.Expect(c.Delete(context.TODO(), fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(c.Get(context.TODO(), key, fetched)).To(gomega.HaveOccurred())
-}
diff --git a/pkg/apis/schemas/v1alpha2/sql_types_test.go b/pkg/apis/schemas/v1alpha2/sql_types_test.go
deleted file mode 100644
index ace4ce8b..00000000
--- a/pkg/apis/schemas/v1alpha2/sql_types_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"gopkg.in/yaml.v2"
-)
-
-func Test_SQLTypes(t *testing.T) {
-	const fk = `
-isDeleted: false
-columns:
-  - name: id
-    type: integer
-  - name: order_id
-    type: integer
-primaryKey:
-  - id
-foreignKeys:
-  - columns:
-      - order_id
-    references:
-      table: order
-      columns:
-        - id
-`
-
-	g := gomega.NewGomegaWithT(t)
-
-	table := SQLTableSchema{}
-	err := yaml.Unmarshal([]byte(fk), &table)
-	g.Expect(err).NotTo(gomega.HaveOccurred())
-	g.Expect(table.Columns).To(gomega.HaveLen(2))
-	g.Expect(table.ForeignKeys).To(gomega.HaveLen(1))
-
-	g.Expect(table.ForeignKeys[0].Columns).To(gomega.HaveLen(1))
-	g.Expect(table.ForeignKeys[0].Columns[0]).To(gomega.Equal("order_id"))
-
-	g.Expect(table.ForeignKeys[0].References.Table).To(gomega.Equal("order"))
-	g.Expect(table.ForeignKeys[0].References.Columns).To(gomega.HaveLen(1))
-	g.Expect(table.ForeignKeys[0].References.Columns[0]).To(gomega.Equal("id"))
-
-}
diff --git a/pkg/apis/schemas/v1alpha2/table_types_test.go b/pkg/apis/schemas/v1alpha2/table_types_test.go
deleted file mode 100644
index dab30620..00000000
--- a/pkg/apis/schemas/v1alpha2/table_types_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"testing"
-
-	"github.com/onsi/gomega"
-	"golang.org/x/net/context"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/types"
-)
-
-func TestStorageTable(t *testing.T) {
-	key := types.NamespacedName{
-		Name:      "foo",
-		Namespace: "default",
-	}
-
-	column := SQLTableColumn{
-		Name: "c",
-		Type: "t",
-	}
-
-	created := &Table{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "foo",
-			Namespace: "default",
-		},
-		Spec: TableSpec{
-			Database: "d",
-			Name:     "n",
-			Schema: &TableSchema{
-				Postgres: &SQLTableSchema{
-					PrimaryKey: []string{"pk"},
-					Columns: []*SQLTableColumn{
-						&column,
-					},
-				},
-			},
-		},
-	}
-	g := gomega.NewGomegaWithT(t)
-
-	// Test Create
-	fetched := &Table{}
-	g.Expect(c.Create(context.TODO(), created)).NotTo(gomega.HaveOccurred())
-
-	g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(fetched).To(gomega.Equal(created))
-
-	// Test Updating the Labels
-	updated := fetched.DeepCopy()
-	updated.Labels = map[string]string{"hello": "world"}
-	g.Expect(c.Update(context.TODO(), updated)).NotTo(gomega.HaveOccurred())
-
-	g.Expect(c.Get(context.TODO(), key, fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(fetched).To(gomega.Equal(updated))
-
-	// Test Delete
-	g.Expect(c.Delete(context.TODO(), fetched)).NotTo(gomega.HaveOccurred())
-	g.Expect(c.Get(context.TODO(), key, fetched)).To(gomega.HaveOccurred())
-}
diff --git a/pkg/apis/schemas/v1alpha2/v1alpha1_suite_test.go b/pkg/apis/schemas/v1alpha2/v1alpha1_suite_test.go
deleted file mode 100644
index 8b415045..00000000
--- a/pkg/apis/schemas/v1alpha2/v1alpha1_suite_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-Copyright 2019 Replicated, Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package v1alpha2
-
-import (
-	"log"
-	"os"
-	"path/filepath"
-	"testing"
-
-	"k8s.io/client-go/kubernetes/scheme"
-	"k8s.io/client-go/rest"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/envtest"
-)
-
-var cfg *rest.Config
-var c client.Client
-
-func TestMain(m *testing.M) {
-	t := &envtest.Environment{
-		CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "..", "config", "crds")},
-	}
-
-	err := SchemeBuilder.AddToScheme(scheme.Scheme)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	if cfg, err = t.Start(); err != nil {
-		log.Fatal(err)
-	}
-
-	if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {
-		log.Fatal(err)
-	}
-
-	code := m.Run()
-	t.Stop()
-	os.Exit(code)
-}
diff --git a/pkg/database/mysql/alter_test.go b/pkg/database/mysql/alter_test.go
index 7c7df09e..ef58ee07 100644
--- a/pkg/database/mysql/alter_test.go
+++ b/pkg/database/mysql/alter_test.go
@@ -3,7 +3,7 @@ package mysql
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 
 	"github.com/stretchr/testify/assert"
@@ -17,19 +17,19 @@ func Test_AlterColumnStatment(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		desiredColumns    []*schemasv1alpha2.SQLTableColumn
+		desiredColumns    []*schemasv1alpha3.SQLTableColumn
 		existingColumn    *types.Column
 		expectedStatement string
 	}{
 		{
 			name:      "no change",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
-				&schemasv1alpha2.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "b",
 					Type: "integer",
 				},
@@ -44,12 +44,12 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "change data type",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
-				&schemasv1alpha2.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "b",
 					Type: "integer",
 				},
@@ -64,8 +64,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "drop column",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
@@ -80,11 +80,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "add not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &trueValue,
 					},
 				},
@@ -102,11 +102,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "drop not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &falseValue,
 					},
 				},
@@ -124,8 +124,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "no change to not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "t",
 					Type: "text",
 				},
@@ -143,11 +143,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "type change, constraint no change",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &trueValue,
 					},
 				},
@@ -165,8 +165,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default set",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name:    "a",
 					Type:    "integer",
 					Default: &defaultEleven,
@@ -181,8 +181,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default unset",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
@@ -197,8 +197,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default empty string",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name:    "a",
 					Type:    "varchar (32)",
 					Default: &defaultEmpty,
@@ -213,11 +213,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		// {
 		// 	name:      "no change to not nullable timestamp using short column type",
 		// 	tableName: "ts",
-		// 	desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-		// 		&schemasv1alpha2.SQLTableColumn{
+		// 	desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+		// 		&schemasv1alpha3.SQLTableColumn{
 		// 			Name: "ts",
 		// 			Type: "timestamp",
-		// 			Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+		// 			Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 		// 				NotNull: &trueValue,
 		// 			},
 		// 		},
@@ -235,11 +235,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		// {
 		// 	name:      "no change to not nullable timestamp",
 		// 	tableName: "ts",
-		// 	desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-		// 		&schemasv1alpha2.SQLTableColumn{
+		// 	desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+		// 		&schemasv1alpha3.SQLTableColumn{
 		// 			Name: "ts",
 		// 			Type: "timestamp with time zone",
-		// 			Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+		// 			Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 		// 				NotNull: &trueValue,
 		// 			},
 		// 		},
diff --git a/pkg/database/mysql/column_test.go b/pkg/database/mysql/column_test.go
index 86368e7f..5e9983c7 100644
--- a/pkg/database/mysql/column_test.go
+++ b/pkg/database/mysql/column_test.go
@@ -3,7 +3,7 @@ package mysql
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 
 	"github.com/stretchr/testify/assert"
@@ -14,15 +14,15 @@ func Test_mysqlColumnAsInsert(t *testing.T) {
 	default11 := "11"
 	tests := []struct {
 		name              string
-		column            *schemasv1alpha2.SQLTableColumn
+		column            *schemasv1alpha3.SQLTableColumn
 		expectedStatement string
 	}{
 		{
 			name: "simple",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &trueValue,
 				},
 				Default: &default11,
@@ -46,13 +46,13 @@ func Test_InsertColumnStatement(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		desiredColumn     *schemasv1alpha2.SQLTableColumn
+		desiredColumn     *schemasv1alpha3.SQLTableColumn
 		expectedStatement string
 	}{
 		{
 			name:      "add column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
 			},
@@ -61,10 +61,10 @@ func Test_InsertColumnStatement(t *testing.T) {
 		{
 			name:      "add not null column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &trueValue,
 				},
 			},
@@ -73,10 +73,10 @@ func Test_InsertColumnStatement(t *testing.T) {
 		{
 			name:      "add null column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &falseValue,
 				},
 			},
@@ -98,12 +98,12 @@ func Test_InsertColumnStatement(t *testing.T) {
 func Test_schemaColumnToMysqlColumn(t *testing.T) {
 	tests := []struct {
 		name           string
-		schemaColumn   *schemasv1alpha2.SQLTableColumn
+		schemaColumn   *schemasv1alpha3.SQLTableColumn
 		expectedColumn *types.Column
 	}{
 		{
 			name: "varchar (10)",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "vc",
 				Type: "varchar (10)",
 			},
@@ -115,7 +115,7 @@ func Test_schemaColumnToMysqlColumn(t *testing.T) {
 		},
 		{
 			name: "bool",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "b",
 				Type: "bool",
 			},
diff --git a/pkg/database/mysql/create_test.go b/pkg/database/mysql/create_test.go
index 109e907a..e493bd82 100644
--- a/pkg/database/mysql/create_test.go
+++ b/pkg/database/mysql/create_test.go
@@ -3,7 +3,7 @@ package mysql
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -12,18 +12,18 @@ import (
 func Test_CreateTableStatement(t *testing.T) {
 	tests := []struct {
 		name              string
-		tableSchema       *schemasv1alpha2.SQLTableSchema
+		tableSchema       *schemasv1alpha3.SQLTableSchema
 		tableName         string
 		expectedStatement string
 	}{
 		{
 			name: "simple",
-			tableSchema: &schemasv1alpha2.SQLTableSchema{
+			tableSchema: &schemasv1alpha3.SQLTableSchema{
 				PrimaryKey: []string{
 					"id",
 				},
-				Columns: []*schemasv1alpha2.SQLTableColumn{
-					&schemasv1alpha2.SQLTableColumn{
+				Columns: []*schemasv1alpha3.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "id",
 						Type: "integer",
 					},
@@ -34,21 +34,21 @@ func Test_CreateTableStatement(t *testing.T) {
 		},
 		{
 			name: "composite primary key",
-			tableSchema: &schemasv1alpha2.SQLTableSchema{
+			tableSchema: &schemasv1alpha3.SQLTableSchema{
 				PrimaryKey: []string{
 					"one",
 					"two",
 				},
-				Columns: []*schemasv1alpha2.SQLTableColumn{
-					&schemasv1alpha2.SQLTableColumn{
+				Columns: []*schemasv1alpha3.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "one",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "two",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "three",
 						Type: "varchar(255)",
 					},
diff --git a/pkg/database/mysql/foreignkey_test.go b/pkg/database/mysql/foreignkey_test.go
index 56a3c7bf..e8d22403 100644
--- a/pkg/database/mysql/foreignkey_test.go
+++ b/pkg/database/mysql/foreignkey_test.go
@@ -3,7 +3,7 @@ package mysql
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 
 	"github.com/stretchr/testify/assert"
 )
@@ -12,17 +12,17 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		schemaForeignKey  *schemasv1alpha2.SQLTableForeignKey
+		schemaForeignKey  *schemasv1alpha3.SQLTableForeignKey
 		expectedStatement string
 	}{
 		{
 			name:      "no name, one column, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -34,12 +34,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "named, one column, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Name: "hi_i_am_a_fkey",
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -51,12 +51,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "no name, two columns, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Columns: []string{
 					"c2",
 					"c22",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -69,12 +69,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "no name, one column, on delete cascade",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				OnDelete: "cascade",
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
diff --git a/pkg/database/postgres/alter_test.go b/pkg/database/postgres/alter_test.go
index 5e47435e..c9659b0b 100644
--- a/pkg/database/postgres/alter_test.go
+++ b/pkg/database/postgres/alter_test.go
@@ -3,7 +3,7 @@ package postgres
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 
 	"github.com/stretchr/testify/assert"
@@ -17,19 +17,19 @@ func Test_AlterColumnStatment(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		desiredColumns    []*schemasv1alpha2.SQLTableColumn
+		desiredColumns    []*schemasv1alpha3.SQLTableColumn
 		existingColumn    *types.Column
 		expectedStatement string
 	}{
 		{
 			name:      "no change",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
-				&schemasv1alpha2.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "b",
 					Type: "integer",
 				},
@@ -44,8 +44,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "no change varchar",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "varchar(32)",
 				},
@@ -59,12 +59,12 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "change data type",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
-				&schemasv1alpha2.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "b",
 					Type: "integer",
 				},
@@ -79,8 +79,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "drop column",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
@@ -95,11 +95,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "add not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &trueValue,
 					},
 				},
@@ -117,11 +117,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "drop not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &falseValue,
 					},
 				},
@@ -139,8 +139,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "no change to not null constraint",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "t",
 					Type: "text",
 				},
@@ -158,11 +158,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "no change to not nullable timestamp using short column type",
 			tableName: "ts",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "ts",
 					Type: "timestamp",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &trueValue,
 					},
 				},
@@ -180,11 +180,11 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "no change to not nullable timestamp",
 			tableName: "ts",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "ts",
 					Type: "timestamp with time zone",
-					Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+					Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 						NotNull: &trueValue,
 					},
 				},
@@ -202,8 +202,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default set",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name:    "a",
 					Type:    "integer",
 					Default: &defaultEleven,
@@ -218,8 +218,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default unset",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name: "a",
 					Type: "integer",
 				},
@@ -234,8 +234,8 @@ func Test_AlterColumnStatment(t *testing.T) {
 		{
 			name:      "default empty string",
 			tableName: "t",
-			desiredColumns: []*schemasv1alpha2.SQLTableColumn{
-				&schemasv1alpha2.SQLTableColumn{
+			desiredColumns: []*schemasv1alpha3.SQLTableColumn{
+				&schemasv1alpha3.SQLTableColumn{
 					Name:    "a",
 					Type:    "varchar (32)",
 					Default: &defaultEmpty,
diff --git a/pkg/database/postgres/column_test.go b/pkg/database/postgres/column_test.go
index 67536cd6..2b181dc9 100644
--- a/pkg/database/postgres/column_test.go
+++ b/pkg/database/postgres/column_test.go
@@ -3,7 +3,7 @@ package postgres
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	"github.com/schemahero/schemahero/pkg/database/types"
 
 	"github.com/stretchr/testify/assert"
@@ -14,12 +14,12 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 	default11 := "11"
 	tests := []struct {
 		name              string
-		column            *schemasv1alpha2.SQLTableColumn
+		column            *schemasv1alpha3.SQLTableColumn
 		expectedStatement string
 	}{
 		{
 			name: "simple",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "integer",
 			},
@@ -27,7 +27,7 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "text",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "t",
 				Type: "text",
 			},
@@ -35,7 +35,7 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "timestamp without time zone",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "t",
 				Type: "timestamp without time zone",
 			},
@@ -43,7 +43,7 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "character varying (4)",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "character varying (4)",
 			},
@@ -51,10 +51,10 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "constraint not null",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &trueValue,
 				},
 			},
@@ -62,7 +62,7 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "default",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name:    "c",
 				Type:    "integer",
 				Default: &default11,
@@ -71,7 +71,7 @@ func Test_postgresColumnAsInsert(t *testing.T) {
 		},
 		{
 			name: "text[]",
-			column: &schemasv1alpha2.SQLTableColumn{
+			column: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "text[]",
 			},
@@ -94,13 +94,13 @@ func Test_InsertColumnStatement(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		desiredColumn     *schemasv1alpha2.SQLTableColumn
+		desiredColumn     *schemasv1alpha3.SQLTableColumn
 		expectedStatement string
 	}{
 		{
 			name:      "add column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
 			},
@@ -109,10 +109,10 @@ func Test_InsertColumnStatement(t *testing.T) {
 		{
 			name:      "add not null column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &trueValue,
 				},
 			},
@@ -121,10 +121,10 @@ func Test_InsertColumnStatement(t *testing.T) {
 		{
 			name:      "add null column",
 			tableName: "t",
-			desiredColumn: &schemasv1alpha2.SQLTableColumn{
+			desiredColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "a",
 				Type: "integer",
-				Constraints: &schemasv1alpha2.SQLTableColumnConstraints{
+				Constraints: &schemasv1alpha3.SQLTableColumnConstraints{
 					NotNull: &falseValue,
 				},
 			},
@@ -146,12 +146,12 @@ func Test_InsertColumnStatement(t *testing.T) {
 func Test_schemaColumnToPostgresColumn(t *testing.T) {
 	tests := []struct {
 		name           string
-		schemaColumn   *schemasv1alpha2.SQLTableColumn
+		schemaColumn   *schemasv1alpha3.SQLTableColumn
 		expectedColumn *types.Column
 	}{
 		{
 			name: "text",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "t",
 				Type: "text",
 			},
@@ -164,7 +164,7 @@ func Test_schemaColumnToPostgresColumn(t *testing.T) {
 		},
 		{
 			name: "character varying (10)",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "c",
 				Type: "character varying (10)",
 			},
@@ -176,7 +176,7 @@ func Test_schemaColumnToPostgresColumn(t *testing.T) {
 		},
 		{
 			name: "varchar (10)",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "vc",
 				Type: "varchar (10)",
 			},
@@ -188,7 +188,7 @@ func Test_schemaColumnToPostgresColumn(t *testing.T) {
 		},
 		{
 			name: "cidr",
-			schemaColumn: &schemasv1alpha2.SQLTableColumn{
+			schemaColumn: &schemasv1alpha3.SQLTableColumn{
 				Name: "ip",
 				Type: "cidr",
 			},
diff --git a/pkg/database/postgres/create_test.go b/pkg/database/postgres/create_test.go
index 8b3e070a..66ac9684 100644
--- a/pkg/database/postgres/create_test.go
+++ b/pkg/database/postgres/create_test.go
@@ -3,7 +3,7 @@ package postgres
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -12,18 +12,18 @@ import (
 func Test_CreateTableStatement(t *testing.T) {
 	tests := []struct {
 		name              string
-		tableSchema       *schemasv1alpha2.SQLTableSchema
+		tableSchema       *schemasv1alpha3.SQLTableSchema
 		tableName         string
 		expectedStatement string
 	}{
 		{
 			name: "simple",
-			tableSchema: &schemasv1alpha2.SQLTableSchema{
+			tableSchema: &schemasv1alpha3.SQLTableSchema{
 				PrimaryKey: []string{
 					"id",
 				},
-				Columns: []*schemasv1alpha2.SQLTableColumn{
-					&schemasv1alpha2.SQLTableColumn{
+				Columns: []*schemasv1alpha3.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "id",
 						Type: "integer",
 					},
@@ -34,21 +34,21 @@ func Test_CreateTableStatement(t *testing.T) {
 		},
 		{
 			name: "composite primary key",
-			tableSchema: &schemasv1alpha2.SQLTableSchema{
+			tableSchema: &schemasv1alpha3.SQLTableSchema{
 				PrimaryKey: []string{
 					"one",
 					"two",
 				},
-				Columns: []*schemasv1alpha2.SQLTableColumn{
-					&schemasv1alpha2.SQLTableColumn{
+				Columns: []*schemasv1alpha3.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "one",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "two",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "three",
 						Type: "varchar(255)",
 					},
@@ -59,26 +59,26 @@ func Test_CreateTableStatement(t *testing.T) {
 		},
 		{
 			name: "composite unique index",
-			tableSchema: &schemasv1alpha2.SQLTableSchema{
+			tableSchema: &schemasv1alpha3.SQLTableSchema{
 				PrimaryKey: []string{
 					"one",
 				},
-				Indexes: []*schemasv1alpha2.SQLTableIndex{
-					&schemasv1alpha2.SQLTableIndex{
+				Indexes: []*schemasv1alpha3.SQLTableIndex{
+					&schemasv1alpha3.SQLTableIndex{
 						Columns:  []string{"two", "three"},
 						IsUnique: true,
 					},
 				},
-				Columns: []*schemasv1alpha2.SQLTableColumn{
-					&schemasv1alpha2.SQLTableColumn{
+				Columns: []*schemasv1alpha3.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "one",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "two",
 						Type: "integer",
 					},
-					&schemasv1alpha2.SQLTableColumn{
+					&schemasv1alpha3.SQLTableColumn{
 						Name: "three",
 						Type: "varchar(255)",
 					},
diff --git a/pkg/database/postgres/foreignkey_test.go b/pkg/database/postgres/foreignkey_test.go
index 0e01db02..204695c5 100644
--- a/pkg/database/postgres/foreignkey_test.go
+++ b/pkg/database/postgres/foreignkey_test.go
@@ -3,7 +3,7 @@ package postgres
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 
 	"github.com/stretchr/testify/assert"
 )
@@ -12,17 +12,17 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		schemaForeignKey  *schemasv1alpha2.SQLTableForeignKey
+		schemaForeignKey  *schemasv1alpha3.SQLTableForeignKey
 		expectedStatement string
 	}{
 		{
 			name:      "no name, one column, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -34,12 +34,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "named, one column, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Name: "hi_i_am_a_fkey",
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -51,12 +51,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "no name, two columns, no on delete",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				Columns: []string{
 					"c2",
 					"c22",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
@@ -69,12 +69,12 @@ func Test_AddForeignKeyStatement(t *testing.T) {
 		{
 			name:      "no name, one column, on delete cascade",
 			tableName: "t2",
-			schemaForeignKey: &schemasv1alpha2.SQLTableForeignKey{
+			schemaForeignKey: &schemasv1alpha3.SQLTableForeignKey{
 				OnDelete: "cascade",
 				Columns: []string{
 					"c2",
 				},
-				References: schemasv1alpha2.SQLTableForeignKeyReferences{
+				References: schemasv1alpha3.SQLTableForeignKeyReferences{
 					Table: "t1",
 					Columns: []string{
 						"c1",
diff --git a/pkg/database/postgres/index_test.go b/pkg/database/postgres/index_test.go
index f18f4dea..a25b4f64 100644
--- a/pkg/database/postgres/index_test.go
+++ b/pkg/database/postgres/index_test.go
@@ -3,7 +3,7 @@ package postgres
 import (
 	"testing"
 
-	schemasv1alpha2 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha2"
+	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 
 	"github.com/stretchr/testify/assert"
 )
@@ -12,13 +12,13 @@ func Test_AddIndexStatement(t *testing.T) {
 	tests := []struct {
 		name              string
 		tableName         string
-		schemaIndex       *schemasv1alpha2.SQLTableIndex
+		schemaIndex       *schemasv1alpha3.SQLTableIndex
 		expectedStatement string
 	}{
 		{
 			name:      "no name, one column, not specified unique",
 			tableName: "t2",
-			schemaIndex: &schemasv1alpha2.SQLTableIndex{
+			schemaIndex: &schemasv1alpha3.SQLTableIndex{
 				Columns: []string{
 					"c1",
 				},
@@ -28,7 +28,7 @@ func Test_AddIndexStatement(t *testing.T) {
 		{
 			name:      "specified name, one column, not specified unique",
 			tableName: "t2",
-			schemaIndex: &schemasv1alpha2.SQLTableIndex{
+			schemaIndex: &schemasv1alpha3.SQLTableIndex{
 				Columns: []string{
 					"c1",
 				},
@@ -39,7 +39,7 @@ func Test_AddIndexStatement(t *testing.T) {
 		{
 			name:      "no name, two columns, not specified unique",
 			tableName: "t2",
-			schemaIndex: &schemasv1alpha2.SQLTableIndex{
+			schemaIndex: &schemasv1alpha3.SQLTableIndex{
 				Columns: []string{
 					"c1",
 					"c2",
@@ -50,7 +50,7 @@ func Test_AddIndexStatement(t *testing.T) {
 		{
 			name:      "np name, one column, unique",
 			tableName: "t2",
-			schemaIndex: &schemasv1alpha2.SQLTableIndex{
+			schemaIndex: &schemasv1alpha3.SQLTableIndex{
 				Columns: []string{
 					"c1",
 				},
diff --git a/pkg/generate/generate_test.go b/pkg/generate/generate_test.go
index 63de3133..b4cf94af 100644
--- a/pkg/generate/generate_test.go
+++ b/pkg/generate/generate_test.go
@@ -52,7 +52,7 @@ func Test_writeTableFile(t *testing.T) {
 					DataType: "integer",
 				},
 			},
-			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha2
+			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha3
 kind: Table
 metadata:
   name: simple
@@ -93,7 +93,7 @@ spec:
 					DataType: "integer",
 				},
 			},
-			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha2
+			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha3
 kind: Table
 metadata:
   name: withfk
@@ -146,7 +146,7 @@ spec:
 					},
 				},
 			},
-			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha2
+			expectedYAML: `apiVersion: schemas.schemahero.io/v1alpha3
 kind: Table
 metadata:
   name: simple