Skip to main content

Schema Builder Reference

This is the complete API reference for Sarah's Schema Builder. All methods are available when defining migrations or building queries.

Column Types​

uuid​

Creates a UUID/VARCHAR(36) column.

// Definition only
table.uuid("player_id");

// With value
table.uuid("player_id", playerUuid);

string​

Creates a VARCHAR column.

// Definition with length
table.string("name", 64);

// With value
table.string("name", playerName);

text​

Creates a TEXT column for longer strings.

table.text("description");

longText​

Creates a LONGTEXT column for very long content.

table.longText("content");

integer​

Creates an INT column.

table.integer("count");

bigInt​

Creates a BIGINT column.

// Definition only
table.bigInt("balance");

// With value
table.bigInt("balance", 1000L);

decimal​

Creates a DECIMAL column.

// Default precision
table.decimal("price");

// Custom precision (10 total digits, 2 after decimal)
table.decimal("price", 10, 2);

// With value
table.decimal("price", 99.99);

bool​

Creates a TINYINT(1)/BOOLEAN column.

// Definition only
table.bool("is_active");

// With value
table.bool("is_active", true);

json​

Creates a JSON column.

table.json("metadata");

blob​

Creates a BLOB column for binary data.

// Definition only
table.blob("data");

// With byte array
table.blob("data", byteArray);

// With object (auto-serialized)
table.blob("data", myObject);

date​

Creates a DATE column.

table.date("birth_date", new Date());

timestamp​

Creates a TIMESTAMP column.

table.timestamp("verified_at");

object​

Stores any object (serialized).

table.object("settings", settingsObject);

Auto Increment​

autoIncrement​

Creates an auto-incrementing INT primary key.

table.autoIncrement("id");

autoIncrementBigInt​

Creates an auto-incrementing BIGINT primary key.

table.autoIncrementBigInt("id");

Column Modifiers​

primary​

Marks the column as a primary key.

table.uuid("uuid").primary();

nullable​

Allows NULL values.

table.string("nickname", 32).nullable();

unique​

Adds a UNIQUE constraint.

table.string("email", 255).unique();

// Or with explicit boolean
table.string("email", 255).unique(true);

defaultValue​

Sets a default value.

table.bigInt("balance").defaultValue(0);
table.string("status", 16).defaultValue("pending");
table.bool("active").defaultValue(true);

defaultCurrentTimestamp​

Sets default to CURRENT_TIMESTAMP.

table.timestamp("created_at").defaultCurrentTimestamp();

foreignKey​

Creates a foreign key relationship.

// Basic (references 'id' column)
table.uuid("user_id").foreignKey("users");

// With custom column and cascade delete
table.uuid("user_id").foreignKey("users", "uuid", true);

Timestamp Helpers​

timestamps​

Adds both created_at and updated_at columns.

table.timestamps();

createdAt​

Adds only created_at column.

table.createdAt();

updatedAt​

Adds only updated_at column.

table.updatedAt();

WHERE Conditions​

where​

Basic equality or comparison.

// Equality
table.where("name", "Steve");
table.where("uuid", playerUuid);

// Comparison
table.where("balance", ">", 1000);
table.where("level", ">=", 10);
table.where("score", "<", 50);
table.where("rank", "<=", 100);
table.where("status", "!=", "banned");

whereNull​

Checks for NULL values.

table.whereNull("deleted_at");

whereNotNull​

Checks for non-NULL values.

table.whereNotNull("verified_at");

whereIn​

Checks if value is in a list.

// Varargs
table.whereIn("status", "active", "pending", "review");

// List
table.whereIn("name", Arrays.asList("Steve", "Alex"));

// With table prefix
table.whereIn("users", "status", statusList);

JOIN Operations​

leftJoin​

table.leftJoin(
"users", // Primary table
"u", // Alias
"uuid", // Primary column
"orders", // Foreign table
"user_uuid" // Foreign column
);

rightJoin​

table.rightJoin("users", "u", "uuid", "orders", "user_uuid");

innerJoin​

table.innerJoin("users", "u", "uuid", "orders", "user_uuid");

fullJoin​

table.fullJoin("users", "u", "uuid", "orders", "user_uuid");

Join with Additional Condition​

JoinCondition condition = new JoinCondition(...);
table.leftJoin("users", "u", "uuid", "orders", "user_uuid", condition);

SELECT Options​

addSelect​

Specify columns to select.

table.addSelect("name");
table.addSelect("users", "name"); // With table prefix
table.addSelect("users", "name", "userName"); // With alias
table.addSelect("users", "name", "userName", "Unknown"); // With default

distinct​

Select only distinct rows.

table.distinct();

orderBy​

Sort results ascending.

table.orderBy("name");

orderByDesc​

Sort results descending.

table.orderByDesc("created_at");

Schema Types​

Sarah uses different schema types for different operations:

TypeDescriptionCreated By
CREATECreate new tableSchemaBuilder.create()
ALTERModify existing tableSchemaBuilder.alter()
DROPDelete tableSchemaBuilder.drop()
RENAMERename tableSchemaBuilder.rename()
INSERTInsert dataSchemaBuilder.insert()
UPSERTInsert or updateSchemaBuilder.upsert()
UPDATEUpdate dataSchemaBuilder.update()
SELECTQuery dataSchemaBuilder.select()
SELECT_COUNTCount rowsSchemaBuilder.selectCount()
DELETEDelete dataSchemaBuilder.delete()
CREATE_INDEXCreate indexSchemaBuilder.createIndex()

SchemaBuilder Static Methods​

create​

Create a new table.

Schema schema = SchemaBuilder.create(migration, "users", table -> {
table.uuid("uuid").primary();
table.string("name", 64);
});

create (from template)​

Create table from class template.

Schema schema = SchemaBuilder.create(migration, "users", UserDTO.class);

alter​

Modify existing table.

Schema schema = SchemaBuilder.alter(migration, "users", table -> {
table.string("email", 255).nullable();
});

drop​

Delete a table.

Schema schema = SchemaBuilder.drop(migration, "old_table");

rename​

Rename a table.

Schema schema = SchemaBuilder.rename(migration, "old_name", "new_name");

createIndex​

Create an index.

Schema schema = SchemaBuilder.createIndex(migration, "users", "email");

insert​

Insert data.

Schema schema = SchemaBuilder.insert("users", table -> {
table.uuid("uuid", uuid);
table.string("name", name);
});

upsert​

Insert or update data.

Schema schema = SchemaBuilder.upsert("users", table -> {
table.uuid("uuid", uuid).primary();
table.string("name", name);
});

update​

Update data.

Schema schema = SchemaBuilder.update("users", table -> {
table.string("name", newName);
table.where("uuid", uuid);
});

select​

Query data.

Schema schema = SchemaBuilder.select("users");

selectCount​

Count rows.

Schema schema = SchemaBuilder.selectCount("users");

delete​

Delete data.

Schema schema = SchemaBuilder.delete("users");

Execution Methods​

execute​

Execute the schema operation.

int affectedRows = schema.execute(databaseConnection, logger);

executeSelect​

Execute a SELECT query.

List<Map<String, Object>> results = schema.executeSelect(databaseConnection, logger);

executeSelect (with mapping)​

Execute SELECT and map to objects.

List<UserDTO> users = schema.executeSelect(UserDTO.class, databaseConnection, logger);

executeSelectCount​

Execute a COUNT query.

long count = schema.executeSelectCount(databaseConnection, logger);

Complete Example​

public class UserRepository {
private final RequestHelper helper;

public void createUser(User user) {
helper.upsert("users", schema -> {
schema.uuid("uuid", user.getUuid()).primary();
schema.string("name", user.getName());
schema.string("email", user.getEmail()).unique();
schema.bigInt("balance", user.getBalance()).defaultValue(0);
schema.bool("is_premium", user.isPremium()).defaultValue(false);
schema.text("bio").nullable();
schema.json("settings");
schema.timestamps();
});
}

public List<User> findPremiumUsers() {
return helper.select("users", User.class, table -> {
table.where("is_premium", true);
table.whereNotNull("email");
table.orderByDesc("balance");
});
}

public List<User> searchUsers(String query) {
return helper.select("users", User.class, table -> {
table.where("name", "LIKE", "%" + query + "%");
});
}

public void deleteInactiveUsers(Date threshold) {
helper.delete("users", table -> {
table.where("last_login", "<", threshold);
table.where("is_premium", false);
});
}
}
Copyright © 2026 GroupeZ|Build #loading...|-