질문:
엑셀 업로드를 통해 INSERT 쿼리 실행전에 중복 데이터를 검증할 수 있나요?
답변:
네 아래와 같이 진행 가능합니다. 엑셀 업로드시 시트 데이터를 먼저 중복 검증하고 문제가 없는 경우 INSERT 쿼리(w/ forEach)를 실행하는 예제입니다.
blocks:
- type: query
id: findNames
resource: mysql.qa
sqlType: select
sql: |
SELECT name FROM properties3
WHERE name IN ('', :names)
params:
- key: names
hidden: true
autoload: false
- type: query
resource: mysql.qa
sqlType: select
sql: >
SELECT 1
actions:
- label: 엑셀 업로드
placement: right bottom
single: true
button:
type: success
type: query
resource: mysql.qa
sqlType: insert
sql: >
INSERT INTO properties3
SET name = :name
forEach: true
params:
- key: sheet
format: sheet
# accept: .csv,.xls,.xlsx
- key: name
valueFromSheet: 이름
- key: address
valueFromSheet: 주소
requestFn: |
const sheet = params.find(e => e.key == 'sheet')
console.log('values >>>', sheet.values)
if (sheet.values.length == 0) {
// 취소
toast('업로드 0건')
return false
}
// 원본 엑셀데이터에서 가져오기
const names = sheet.values.map(e => e['이름'])
// 해당 블록 실행전에 param 넣기
const param = findNames.$params.find(e => e.key == 'names')
param.values = names
// 실행 결과물 확인
const findNamesResult = await findNames.trigger()
console.log('>>findNamesResult', findNamesResult.rows)
if (findNamesResult.rows.length) {
const found = findNamesResult.rows.map(e => '- ' + e.name)
toast(`이름 중복건이 있습니다: <br />${found.join('<br />')}`)
return false
}
이외 다른 방법으로 도움이 필요하신 경우 문의주시기 바랍니다.
감사합니다.