Open4

Error: D1_ERROR: too many SQL variables at offset 571 の対処法

motoimotoi

配列をD1にinsertしようとすると、
Error: D1_ERROR: too many SQL variables at offset 571
のエラーが発生。

え、そんな大きな配列じゃないのに!?と思って調べた。

motoimotoi

公式サイトに各limitが記載されていた。
今回引っかかったのは、Maximum bound parameters per queryでlimitは100
1オブジェクトあたり、9個データがあったので、10個弱のオブジェクトしか一度にinsertできない。
まあこんなもんか…

motoimotoi

となると、chunkしてPromise.allでinsertするしか今のところ対処法がない。

const chunkArray = <T>(array: T[], size: number): T[][] => {
    const result: T[][] = []
        for (let i = 0; i < array.length; i += size) {
        result.push(array.slice(i, i + size))
    }

  return result
}

const insertDataInChunks = async (data: Example[], chunkSize: number) => {
    const chunks = chunkArray<Example>(data, chunkSize)
    await Promise.all(
        chunks.map(async (dataToInsert) => {
            await db.insert(events).values(dataToInsert).execute()
        }),
    )
}

const CHUNK_SIZE = 10
await insertDataInChunks(exampleArray, CHUNK_SIZE)
motoimotoi

公式ページの最下部に、limit解除のリクエストができるGoogle Formがあったので一応送ってみた。返答待ち。