fix: UPDATE 액션 동적 기본키 조회 기능 추가
문제: - UPDATE 액션 실행 시 ID 필요 에러 - executeUpdate가 하드코딩된 id 필드만 찾음 - 실제 테이블 기본키는 다를 수 있음 해결: 1. 테이블 기본키 동적 조회 2. 기본키 값 동적 추출 3. 동적 UPDATE 쿼리 생성 4. 상세 로깅 추가 결과: - 모든 테이블의 UPDATE 동작 - 동적 기본키 처리
This commit is contained in:
parent
cb1a6ad672
commit
151de4148c
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue