Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,14 @@ defer db.Close()
table := schema.NewTable("users")

err := table.AddColumns(
schema.NewColumnParams{Name: "id", Type: schema.Integer, PrimaryKey: true, AutoIncrement: true},
schema.NewColumnParams{Name: "id", Type: schema.Integer, NotNull: true, AutoIncrement: true},
schema.NewColumnParams{Name: "name", Type: schema.Varchar, Size: 50, NotNull: false},
)

if err != nil {
// handle error
}

_ = table.HasPrimaryKey("id")
db.SQLExecutor().Exec(db.SQLBuilder().CreateTable(table))
```

Expand Down Expand Up @@ -212,7 +212,7 @@ func (m M0001CreateUserTable) Up(migrator *migrations.Migrator) error {
}

err := table.AddColumns(
schema.NewColumnParams{Name: "id", Type: schema.Integer, PrimaryKey: true, AutoIncrement: true},
schema.NewColumnParams{Name: "id", Type: schema.Integer, NotNull: true, AutoIncrement: true},
schema.NewColumnParams{Name: "name", Type: schema.Varchar, Size: 50, NotNull: false},
schema.NewColumnParams{Name: "email", Type: schema.Varchar, Size: 120, NotNull: false},
schema.NewColumnParams{Name: "is_active", Type: schema.Boolean, NotNull: false},
Expand All @@ -221,6 +221,7 @@ func (m M0001CreateUserTable) Up(migrator *migrations.Migrator) error {
return err
}

_ = table.HasPrimaryKey("id")
_, err = db.SQLExecutor().Exec(db.SQLBuilder().CreateTable(table))
return err
}
Expand Down
6 changes: 6 additions & 0 deletions dialects/postgresql/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ func (sb *postgresqlBuilder) columnDefinition(column schema.Column) string {
if column.NotNull() {
columnDef += " NOT NULL"
}
if column.Default() != "" {
columnDef += " DEFAULT " + column.Default()
}
if column.Check() != "" {
columnDef += " CHECK (" + column.Check() + ")"
}
return columnDef
}

Expand Down
19 changes: 17 additions & 2 deletions dialects/postgresql/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ordershift/ormshift"
"github.com/ordershift/ormshift/dialects/postgresql"
"github.com/ordershift/ormshift/internal/testutils"
"github.com/ordershift/ormshift/schema"
)

func TestInteroperateSQLCommandWithNamedArgs(t *testing.T) {
Expand Down Expand Up @@ -44,14 +45,19 @@ func TestCreateTable(t *testing.T) {
userTable := testutils.FakeUserTable(t)
expectedSQL := "CREATE TABLE \"user\" (\"id\" BIGSERIAL NOT NULL,\"email\" VARCHAR(80) NOT NULL,\"name\" VARCHAR(50) NOT NULL," +
"\"password_hash\" VARCHAR(256),\"active\" SMALLINT,\"created_at\" TIMESTAMP(6),\"updated_at\" TIMESTAMPTZ(6),\"user_master\" BIGINT,\"master_user_id\" BIGINT," +
"\"licence_price\" NUMERIC(17,2),\"relevance\" DOUBLE PRECISION,\"photo\" BYTEA,\"any\" VARCHAR,PRIMARY KEY (\"id\",\"email\"));"
"\"licence_price\" NUMERIC(17,2),\"relevance\" DOUBLE PRECISION,\"photo\" BYTEA,\"any\" VARCHAR, CONSTRAINT \"PK_user\" PRIMARY KEY (\"id\"), CONSTRAINT \"UC_user_email\" UNIQUE (\"email\"));"
returnedSQL := sqlBuilder.CreateTable(userTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

productAttributeTable := testutils.FakeProductAttributeTable(t)
expectedSQL = "CREATE TABLE \"product_attribute\" (\"product_id\" BIGINT NOT NULL,\"attribute_id\" BIGINT NOT NULL,\"value\" VARCHAR(75),\"position\" BIGINT,PRIMARY KEY (\"product_id\",\"attribute_id\"));"
expectedSQL = "CREATE TABLE \"product_attribute\" (\"product_id\" BIGINT NOT NULL,\"attribute_id\" BIGINT NOT NULL,\"value\" VARCHAR(75),\"position\" BIGINT, CONSTRAINT \"PK_product_attribute\" PRIMARY KEY (\"product_id\",\"attribute_id\"), CONSTRAINT \"FK_product_attribute_product\" FOREIGN KEY (\"product_id\") REFERENCES \"product\" (\"id\"), CONSTRAINT \"FK_product_attribute_attribute\" FOREIGN KEY (\"attribute_id\") REFERENCES \"attribute\" (\"id\"));"
returnedSQL = sqlBuilder.CreateTable(productAttributeTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

tableWithCompositeFKAndUC := testutils.FakeTableWithCompositeFKAndUC(t)
expectedSQL = "CREATE TABLE \"booking\" (\"resource_id\" BIGINT NOT NULL,\"slot_date\" VARCHAR(10) NOT NULL,\"slot_hour\" BIGINT NOT NULL,\"guest_id\" BIGINT, CONSTRAINT \"PK_booking\" PRIMARY KEY (\"resource_id\",\"slot_date\",\"slot_hour\"), CONSTRAINT \"FK_booking_resource_schedule\" FOREIGN KEY (\"resource_id\",\"slot_date\") REFERENCES \"resource_schedule\" (\"resource_id\",\"schedule_date\"), CONSTRAINT \"UC_booking_resource_id_slot_date_slot_hour\" UNIQUE (\"resource_id\",\"slot_date\",\"slot_hour\"));"
returnedSQL = sqlBuilder.CreateTable(tableWithCompositeFKAndUC)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable with composite FK and UC")
}

func TestDropTable(t *testing.T) {
Expand Down Expand Up @@ -97,6 +103,15 @@ func TestAlterTableAddColumn(t *testing.T) {
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn")

columnWithDefault := schema.NewColumn(schema.NewColumnParams{Name: "quantity", Type: schema.Integer, Default: "0"})
expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"quantity\" BIGINT DEFAULT 0;"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnWithDefault)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with Default")

columnWithCheck := schema.NewColumn(schema.NewColumnParams{Name: "score", Type: schema.Integer, Check: "score >= 0 AND score <= 100"})
expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"score\" BIGINT CHECK (score >= 0 AND score <= 100);"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnWithCheck)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with Check")
}

func TestAlterTableDropColumn(t *testing.T) {
Expand Down
87 changes: 64 additions & 23 deletions dialects/sqlite/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package sqlite
import (
"database/sql"
"fmt"
"strings"

"github.com/ordershift/ormshift"
"github.com/ordershift/ormshift/internal"
Expand All @@ -20,35 +21,69 @@ func newSQLiteBuilder() ormshift.SQLBuilder {
}

func (sb *sqliteBuilder) CreateTable(table schema.Table) string {
columns := ""
pkColumns := ""
autoInc := false
for _, column := range table.Columns() {
if columns != "" {
columns += ","
useInlinePK, pkColName := sb.useInlineSingleIntegerAutoIncrementPK(table)
parts := sb.buildCreateTableColumnParts(table, useInlinePK, pkColName)
parts = sb.appendPKConstraintPart(parts, table, useInlinePK)
parts = sb.appendFKConstraintParts(parts, table)
parts = sb.appendUCConstraintParts(parts, table)
return fmt.Sprintf("CREATE TABLE %s (%s);", sb.QuoteIdentifier(table.Name()), strings.Join(parts, ","))
}

func (sb *sqliteBuilder) useInlineSingleIntegerAutoIncrementPK(table schema.Table) (bool, string) {
pk := table.PrimaryKey()
if pk == nil || len(pk.Columns()) != 1 {
return false, ""
}
pkColName := pk.Columns()[0]
for _, col := range table.Columns() {
if strings.EqualFold(col.Name(), pkColName) {
return col.Type() == schema.Integer && col.AutoIncrement(), pkColName
}
columns += sb.columnDefinition(column)
}
return false, pkColName
}

if column.PrimaryKey() {
if pkColumns != "" {
pkColumns += ","
}
pkColumns += sb.QuoteIdentifier(column.Name())
func (sb *sqliteBuilder) buildCreateTableColumnParts(table schema.Table, useInlinePK bool, pkColName string) []string {
var parts []string
for _, column := range table.Columns() {
if useInlinePK && strings.EqualFold(column.Name(), pkColName) {
parts = append(parts, fmt.Sprintf("%s INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT", sb.QuoteIdentifier(column.Name())))
} else {
parts = append(parts, sb.columnDefinition(column))
}
}
return parts
}

if !autoInc {
autoInc = column.AutoIncrement()
}
func (sb *sqliteBuilder) appendPKConstraintPart(parts []string, table schema.Table, useInlinePK bool) []string {
pk := table.PrimaryKey()
if pk == nil || useInlinePK {
return parts
}
return append(parts, fmt.Sprintf("CONSTRAINT %s PRIMARY KEY (%s)", sb.QuoteIdentifier(pk.Name()), sb.quotedColumnList(pk.Columns())))
}

func (sb *sqliteBuilder) appendFKConstraintParts(parts []string, table schema.Table) []string {
for _, fk := range table.ForeignKeys() {
parts = append(parts, fmt.Sprintf("CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)",
sb.QuoteIdentifier(fk.Name()), sb.quotedColumnList(fk.FromColumns()), sb.QuoteIdentifier(fk.ToTable()), sb.quotedColumnList(fk.ToColumns())))
}
return parts
}

if !autoInc && pkColumns != "" {
if columns != "" {
columns += ","
}
pkConstraintName := sb.QuoteIdentifier("PK_" + table.Name())
columns += fmt.Sprintf("CONSTRAINT %s PRIMARY KEY (%s)", pkConstraintName, pkColumns)
func (sb *sqliteBuilder) appendUCConstraintParts(parts []string, table schema.Table) []string {
for _, uc := range table.UniqueConstraints() {
parts = append(parts, fmt.Sprintf("CONSTRAINT %s UNIQUE (%s)", sb.QuoteIdentifier(uc.Name()), sb.quotedColumnList(uc.Columns())))
}
return fmt.Sprintf("CREATE TABLE %s (%s);", sb.QuoteIdentifier(table.Name()), columns)
return parts
}

func (sb *sqliteBuilder) quotedColumnList(cols []string) string {
parts := make([]string, len(cols))
for i, col := range cols {
parts[i] = sb.QuoteIdentifier(col)
}
return strings.Join(parts, ",")
}

func (sb *sqliteBuilder) DropTable(table string) string {
Expand Down Expand Up @@ -92,7 +127,13 @@ func (sb *sqliteBuilder) columnDefinition(column schema.Column) string {
columnDef += " NOT NULL"
}
if column.AutoIncrement() {
columnDef += " PRIMARY KEY AUTOINCREMENT"
columnDef += " AUTOINCREMENT"
}
if column.Default() != "" {
columnDef += " DEFAULT " + column.Default()
}
if column.Check() != "" {
columnDef += " CHECK (" + column.Check() + ")"
}
return columnDef
}
Expand Down
29 changes: 27 additions & 2 deletions dialects/sqlite/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ordershift/ormshift"
"github.com/ordershift/ormshift/dialects/sqlite"
"github.com/ordershift/ormshift/internal/testutils"
"github.com/ordershift/ormshift/schema"
)

func TestInteroperateSQLCommandWithNamedArgs(t *testing.T) {
Expand All @@ -24,14 +25,28 @@ func TestCreateTable(t *testing.T) {
userTable := testutils.FakeUserTable(t)
expectedSQL := "CREATE TABLE \"user\" (\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\"email\" TEXT NOT NULL,\"name\" TEXT NOT NULL," +
"\"password_hash\" TEXT,\"active\" INTEGER,\"created_at\" DATETIME,\"updated_at\" DATETIME,\"user_master\" INTEGER," +
"\"master_user_id\" INTEGER,\"licence_price\" REAL,\"relevance\" REAL,\"photo\" BLOB,\"any\" TEXT);"
"\"master_user_id\" INTEGER,\"licence_price\" REAL,\"relevance\" REAL,\"photo\" BLOB,\"any\" TEXT,CONSTRAINT \"UC_user_email\" UNIQUE (\"email\"));"
returnedSQL := sqlBuilder.CreateTable(userTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

productAttributeTable := testutils.FakeProductAttributeTable(t)
expectedSQL = "CREATE TABLE \"product_attribute\" (\"product_id\" INTEGER NOT NULL,\"attribute_id\" INTEGER NOT NULL,\"value\" TEXT,\"position\" INTEGER,CONSTRAINT \"PK_product_attribute\" PRIMARY KEY (\"product_id\",\"attribute_id\"));"
expectedSQL = "CREATE TABLE \"product_attribute\" (\"product_id\" INTEGER NOT NULL,\"attribute_id\" INTEGER NOT NULL,\"value\" TEXT," +
"\"position\" INTEGER,CONSTRAINT \"PK_product_attribute\" PRIMARY KEY (\"product_id\",\"attribute_id\"),CONSTRAINT \"FK_product_attribute_product\" FOREIGN KEY (\"product_id\") REFERENCES \"product\" (\"id\"),CONSTRAINT \"FK_product_attribute_attribute\" FOREIGN KEY (\"attribute_id\") REFERENCES \"attribute\" (\"id\"));"
returnedSQL = sqlBuilder.CreateTable(productAttributeTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

// Single-column PK that is not integer autoincrement uses table-level CONSTRAINT (not inline).
tbl := schema.NewTable("config")
_ = tbl.AddColumns(schema.NewColumnParams{Name: "key", Type: schema.Varchar, Size: 50, NotNull: true})
_ = tbl.HasPrimaryKey("key")
expectedSQL = "CREATE TABLE \"config\" (\"key\" TEXT NOT NULL,CONSTRAINT \"PK_config\" PRIMARY KEY (\"key\"));"
returnedSQL = sqlBuilder.CreateTable(tbl)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable single non-integer PK")

tableWithCompositeFKAndUC := testutils.FakeTableWithCompositeFKAndUC(t)
expectedSQL = "CREATE TABLE \"booking\" (\"resource_id\" INTEGER NOT NULL,\"slot_date\" TEXT NOT NULL,\"slot_hour\" INTEGER NOT NULL,\"guest_id\" INTEGER,CONSTRAINT \"PK_booking\" PRIMARY KEY (\"resource_id\",\"slot_date\",\"slot_hour\"),CONSTRAINT \"FK_booking_resource_schedule\" FOREIGN KEY (\"resource_id\",\"slot_date\") REFERENCES \"resource_schedule\" (\"resource_id\",\"schedule_date\"),CONSTRAINT \"UC_booking_resource_id_slot_date_slot_hour\" UNIQUE (\"resource_id\",\"slot_date\",\"slot_hour\"));"
returnedSQL = sqlBuilder.CreateTable(tableWithCompositeFKAndUC)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable with composite FK and UC")
}

func TestDropTable(t *testing.T) {
Expand Down Expand Up @@ -76,6 +91,16 @@ func TestAlterTableAddColumn(t *testing.T) {
expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"name\" TEXT NOT NULL DEFAULT '';"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn")

columnWithDefault := schema.NewColumn(schema.NewColumnParams{Name: "quantity", Type: schema.Integer, Default: "0"})
expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"quantity\" INTEGER DEFAULT 0;"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnWithDefault)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with Default")

columnWithCheck := schema.NewColumn(schema.NewColumnParams{Name: "score", Type: schema.Integer, Check: "score >= 0 AND score <= 100"})
expectedSQL = "ALTER TABLE \"user\" ADD COLUMN \"score\" INTEGER CHECK (score >= 0 AND score <= 100);"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnWithCheck)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with Check")
}

func TestAlterTableDropColumn(t *testing.T) {
Expand Down
31 changes: 7 additions & 24 deletions dialects/sqlserver/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,7 @@ func newSQLServerBuilder() ormshift.SQLBuilder {
}

func (sb *sqlserverBuilder) CreateTable(table schema.Table) string {
columns := ""
pkColumns := ""
for _, column := range table.Columns() {
if columns != "" {
columns += ","
}
columns += sb.columnDefinition(column)

if column.PrimaryKey() {
if pkColumns != "" {
pkColumns += ","
}
pkColumns += sb.QuoteIdentifier(column.Name())
}
}

if pkColumns != "" {
if columns != "" {
columns += ","
}
pkConstraintName := sb.QuoteIdentifier("PK_" + table.Name())
columns += fmt.Sprintf("CONSTRAINT %s PRIMARY KEY (%s)", pkConstraintName, pkColumns)
}
return fmt.Sprintf("CREATE TABLE %s (%s);", sb.QuoteIdentifier(table.Name()), columns)
return sb.generic.CreateTable(table)
}

func (sb *sqlserverBuilder) DropTable(table string) string {
Expand Down Expand Up @@ -95,6 +72,12 @@ func (sb *sqlserverBuilder) columnDefinition(column schema.Column) string {
if column.AutoIncrement() {
columnDef += " IDENTITY (1, 1)"
}
if column.Default() != "" {
columnDef += " DEFAULT " + column.Default()
}
if column.Check() != "" {
columnDef += " CHECK (" + column.Check() + ")"
}
return columnDef
}

Expand Down
20 changes: 18 additions & 2 deletions dialects/sqlserver/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ordershift/ormshift"
"github.com/ordershift/ormshift/dialects/sqlserver"
"github.com/ordershift/ormshift/internal/testutils"
"github.com/ordershift/ormshift/schema"
)

func TestInteroperateSQLCommandWithNamedArgs(t *testing.T) {
Expand All @@ -24,14 +25,19 @@ func TestCreateTable(t *testing.T) {
userTable := testutils.FakeUserTable(t)
expectedSQL := "CREATE TABLE [user] ([id] BIGINT NOT NULL IDENTITY (1, 1),[email] VARCHAR(80) NOT NULL,[name] VARCHAR(50) NOT NULL," +
"[password_hash] VARCHAR(256),[active] BIT,[created_at] DATETIME2(6),[updated_at] DATETIMEOFFSET(6),[user_master] BIGINT,[master_user_id] BIGINT," +
"[licence_price] MONEY,[relevance] FLOAT,[photo] VARBINARY(MAX),[any] VARCHAR,CONSTRAINT [PK_user] PRIMARY KEY ([id],[email]));"
"[licence_price] MONEY,[relevance] FLOAT,[photo] VARBINARY(MAX),[any] VARCHAR, CONSTRAINT [PK_user] PRIMARY KEY ([id]), CONSTRAINT [UC_user_email] UNIQUE ([email]));"
returnedSQL := sqlBuilder.CreateTable(userTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

productAttributeTable := testutils.FakeProductAttributeTable(t)
expectedSQL = "CREATE TABLE [product_attribute] ([product_id] BIGINT NOT NULL,[attribute_id] BIGINT NOT NULL,[value] VARCHAR(75),[position] BIGINT,CONSTRAINT [PK_product_attribute] PRIMARY KEY ([product_id],[attribute_id]));"
expectedSQL = "CREATE TABLE [product_attribute] ([product_id] BIGINT NOT NULL,[attribute_id] BIGINT NOT NULL,[value] VARCHAR(75),[position] BIGINT, CONSTRAINT [PK_product_attribute] PRIMARY KEY ([product_id],[attribute_id]), CONSTRAINT [FK_product_attribute_product] FOREIGN KEY ([product_id]) REFERENCES [product] ([id]), CONSTRAINT [FK_product_attribute_attribute] FOREIGN KEY ([attribute_id]) REFERENCES [attribute] ([id]));"
returnedSQL = sqlBuilder.CreateTable(productAttributeTable)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable")

tableWithCompositeFKAndUC := testutils.FakeTableWithCompositeFKAndUC(t)
expectedSQL = "CREATE TABLE [booking] ([resource_id] BIGINT NOT NULL,[slot_date] VARCHAR(10) NOT NULL,[slot_hour] BIGINT NOT NULL,[guest_id] BIGINT, CONSTRAINT [PK_booking] PRIMARY KEY ([resource_id],[slot_date],[slot_hour]), CONSTRAINT [FK_booking_resource_schedule] FOREIGN KEY ([resource_id],[slot_date]) REFERENCES [resource_schedule] ([resource_id],[schedule_date]), CONSTRAINT [UC_booking_resource_id_slot_date_slot_hour] UNIQUE ([resource_id],[slot_date],[slot_hour]));"
returnedSQL = sqlBuilder.CreateTable(tableWithCompositeFKAndUC)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.CreateTable with composite FK and UC")
}

func TestDropTable(t *testing.T) {
Expand Down Expand Up @@ -76,6 +82,16 @@ func TestAlterTableAddColumn(t *testing.T) {
expectedSQL = "ALTER TABLE [user] ADD COLUMN [name] VARCHAR(50) NOT NULL DEFAULT '';"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, nameColumn)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn")

columnNotNullOnly := schema.NewColumn(schema.NewColumnParams{Name: "code", Type: schema.Varchar, Size: 20, NotNull: true})
expectedSQL = "ALTER TABLE [user] ADD COLUMN [code] VARCHAR(20) NOT NULL DEFAULT '';"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnNotNullOnly)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with NotNull")

columnWithCheck := schema.NewColumn(schema.NewColumnParams{Name: "score", Type: schema.Integer, Check: "score >= 0 AND score <= 100"})
expectedSQL = "ALTER TABLE [user] ADD COLUMN [score] BIGINT CHECK (score >= 0 AND score <= 100);"
returnedSQL = sqlBuilder.AlterTableAddColumn(userTableName, columnWithCheck)
testutils.AssertEqualWithLabel(t, expectedSQL, returnedSQL, "SQLBuilder.AlterTableAddColumn with Check")
}

func TestAlterTableDropColumn(t *testing.T) {
Expand Down
Loading
Loading