266 lines
5.2 KiB
Markdown
266 lines
5.2 KiB
Markdown
# TaylorDB Write Operations (Insert, Update, Delete)
|
|
|
|
This document covers **write operations** using the TaylorDB query builder:
|
|
|
|
- **Inserting data**
|
|
- **Updating single/multiple records**
|
|
- **Deleting records**
|
|
|
|
---
|
|
|
|
## Inserting Data
|
|
|
|
### Insert Single Record
|
|
|
|
```typescript
|
|
export async function createUser(data: {
|
|
name: string;
|
|
email: string;
|
|
age: number;
|
|
}) {
|
|
return await queryBuilder
|
|
.insertInto("users")
|
|
.values({
|
|
name: data.name,
|
|
email: data.email,
|
|
age: data.age,
|
|
status: "active", // Default value
|
|
})
|
|
.executeTakeFirst();
|
|
}
|
|
```
|
|
|
|
**Returns**: The created record with its generated `id`.
|
|
|
|
### Insert with Single-Select Field
|
|
|
|
Single-select fields now accept a single string value directly.
|
|
|
|
```typescript
|
|
export async function createTask(data: {
|
|
title: string;
|
|
priority: "low" | "medium" | "high";
|
|
}) {
|
|
return await queryBuilder
|
|
.insertInto("tasks")
|
|
.values({
|
|
title: data.title,
|
|
priority: data.priority,
|
|
})
|
|
.executeTakeFirst();
|
|
}
|
|
```
|
|
|
|
### Insert with Multi-Select Field
|
|
|
|
```typescript
|
|
export async function createProject(data: { name: string; tags: string[] }) {
|
|
return await queryBuilder
|
|
.insertInto("projects")
|
|
.values({
|
|
name: data.name,
|
|
tags: data.tags, // Already an array
|
|
})
|
|
.executeTakeFirst();
|
|
}
|
|
```
|
|
|
|
### Insert with Computed Fields
|
|
|
|
```typescript
|
|
export async function createCardioSession(data: {
|
|
distance: number;
|
|
duration: number; // in minutes
|
|
}) {
|
|
const speed = data.distance / (data.duration / 60); // km/h
|
|
|
|
return await queryBuilder
|
|
.insertInto("cardio")
|
|
.values({
|
|
distance: data.distance,
|
|
duration: data.duration,
|
|
speed: speed, // Computed field
|
|
})
|
|
.executeTakeFirst();
|
|
}
|
|
```
|
|
|
|
### Insert with Optional Fields
|
|
|
|
```typescript
|
|
export async function createPost(data: {
|
|
title: string;
|
|
content: string;
|
|
tags?: string[];
|
|
}) {
|
|
return await queryBuilder
|
|
.insertInto("posts")
|
|
.values({
|
|
title: data.title,
|
|
content: data.content,
|
|
tags: data.tags || [], // Default to empty array
|
|
})
|
|
.executeTakeFirst();
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Updating Data
|
|
|
|
### Update Single Field
|
|
|
|
```typescript
|
|
export async function updateUserName(id: number, name: string) {
|
|
return await queryBuilder
|
|
.update("users")
|
|
.set({ name })
|
|
.where("id", "=", id)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
### Update Multiple Fields
|
|
|
|
```typescript
|
|
export async function updateUser(
|
|
id: number,
|
|
data: {
|
|
name?: string;
|
|
email?: string;
|
|
age?: number;
|
|
},
|
|
) {
|
|
return await queryBuilder
|
|
.update("users")
|
|
.set(data)
|
|
.where("id", "=", id)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
**Note**: Only provided fields will be updated.
|
|
|
|
### Update with Single-Select Field
|
|
|
|
```typescript
|
|
export async function updateTaskPriority(
|
|
id: number,
|
|
priority: "low" | "medium" | "high",
|
|
) {
|
|
return await queryBuilder
|
|
.update("tasks")
|
|
.set({ priority })
|
|
.where("id", "=", id)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
### Update with Conditional Logic
|
|
|
|
```typescript
|
|
export async function updateCardioSession(
|
|
id: number,
|
|
data: {
|
|
distance?: number;
|
|
duration?: number;
|
|
},
|
|
) {
|
|
// Fetch current record to compute speed
|
|
const currentRecord = await queryBuilder
|
|
.selectFrom("cardio")
|
|
.select(["distance", "duration"])
|
|
.where("id", "=", id)
|
|
.executeTakeFirst();
|
|
|
|
if (!currentRecord) {
|
|
throw new Error("Record not found");
|
|
}
|
|
|
|
const newDistance = data.distance ?? currentRecord.distance ?? 0;
|
|
const newDuration = data.duration ?? currentRecord.duration ?? 0;
|
|
const speed = newDistance / (newDuration / 60);
|
|
|
|
return await queryBuilder
|
|
.update("cardio")
|
|
.set({
|
|
...data,
|
|
speed,
|
|
})
|
|
.where("id", "=", id)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
### Update Multiple Records
|
|
|
|
```typescript
|
|
export async function activateAllUsers() {
|
|
return await queryBuilder.update("users").set({ status: "active" }).execute(); // No where clause = update all
|
|
}
|
|
|
|
// Update with condition
|
|
export async function activateInactiveUsers() {
|
|
return await queryBuilder
|
|
.update("users")
|
|
.set({ status: "active" })
|
|
.where("status", "=", "inactive")
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Deleting Data
|
|
|
|
### Delete Single Record
|
|
|
|
```typescript
|
|
export async function deleteUser(id: number) {
|
|
return await queryBuilder.deleteFrom("users").where("id", "=", id).execute();
|
|
}
|
|
```
|
|
|
|
### Delete Multiple Records by IDs
|
|
|
|
```typescript
|
|
export async function deleteUsers(ids: number[]) {
|
|
return await queryBuilder
|
|
.deleteFrom("users")
|
|
.where("id", "hasAnyOf", ids)
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
### Delete with Condition
|
|
|
|
```typescript
|
|
export async function deleteInactiveUsers() {
|
|
return await queryBuilder
|
|
.deleteFrom("users")
|
|
.where("status", "=", "inactive")
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
### Delete Old Records
|
|
|
|
```typescript
|
|
export async function deleteOldLogs(beforeDate: string) {
|
|
return await queryBuilder
|
|
.deleteFrom("logs")
|
|
.where("createdAt", "<", ["exactDay", beforeDate])
|
|
.execute();
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
For more topics, see:
|
|
|
|
- `TAYLORDB_BASIC_QUERIES.md` for basic reads and filtering
|
|
- `TAYLORDB_ADVANCED_PATTERNS.md` for aggregations, pagination, and conditional queries
|
|
- `TAYLORDB_FIELD_TYPES.md` for field type handling and enums
|
|
- `TAYLORDB_PITFALLS_BEST_PRACTICES.md` for pitfalls and best practices
|
|
|