fix: UPDATE 액션 동적 기본키 조회 기능 추가

문제:
- UPDATE 액션 실행 시 ID 필요 에러
- executeUpdate가 하드코딩된 id 필드만 찾음
- 실제 테이블 기본키는 다를 수 있음

해결:
1. 테이블 기본키 동적 조회
2. 기본키 값 동적 추출
3. 동적 UPDATE 쿼리 생성
4. 상세 로깅 추가

결과:
- 모든 테이블의 UPDATE 동작
- 동적 기본키 처리
This commit is contained in:
kjs 2025-10-01 15:48:29 +09:00
parent cb1a6ad672
commit 151de4148c
1 changed files with 44 additions and 7 deletions

View File

@ -170,23 +170,60 @@ async function executeInsert(tableName: string, data: Record<string, any>): Prom
*/
async function executeUpdate(tableName: string, data: Record<string, any>): Promise<any> {
try {
// ID 또는 기본키를 기준으로 업데이트
const { id, ...updateData } = data;
logger.info(`UPDATE 액션 시작:`, { tableName, receivedData: data });
if (!id) {
throw new Error('UPDATE를 위한 ID가 필요합니다');
// 1. 테이블의 실제 기본키 조회
const primaryKeyQuery = `
SELECT a.attname as column_name
FROM pg_index i
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
WHERE i.indrelid = $1::regclass AND i.indisprimary
`;
const pkResult = await query<{ column_name: string }>(primaryKeyQuery, [tableName]);
if (!pkResult || pkResult.length === 0) {
throw new Error(`테이블 ${tableName}의 기본키를 찾을 수 없습니다`);
}
const primaryKeyColumn = pkResult[0].column_name;
logger.info(`테이블 ${tableName}의 기본키:`, primaryKeyColumn);
// 2. 기본키 값 추출
const primaryKeyValue = data[primaryKeyColumn];
if (!primaryKeyValue && primaryKeyValue !== 0) {
logger.error(`UPDATE 실패: 기본키 값이 없음`, {
primaryKeyColumn,
receivedData: data,
availableKeys: Object.keys(data),
});
throw new Error(`UPDATE를 위한 기본키 값이 필요합니다 (${primaryKeyColumn})`);
}
// 3. 업데이트할 데이터에서 기본키 제외
const updateData = { ...data };
delete updateData[primaryKeyColumn];
logger.info(`UPDATE 데이터 준비:`, {
primaryKeyColumn,
primaryKeyValue,
updateFields: Object.keys(updateData),
});
// 4. 동적 UPDATE 쿼리 생성
const setClause = Object.keys(updateData)
.map((key, index) => `${key} = $${index + 1}`)
.join(', ');
const values = Object.values(updateData);
const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE id = $${values.length + 1} RETURNING *`;
const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE ${primaryKeyColumn} = $${values.length + 1} RETURNING *`;
logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, id] });
logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, primaryKeyValue] });
const result = await query<any>(updateQuery, [...values, id]);
const result = await query<any>(updateQuery, [...values, primaryKeyValue]);
logger.info(`UPDATE 성공:`, { affectedRows: result.length });
return {
success: true,