用SQL实现对DuckDB rusty_sheet插件批量测试
张泽鹏先生写的插件,我来给他做测试,在网上找到一个https://github.com/jmcnamara/libxlsxwriter工具库自带好多例子xlsx文件,但是文件很多,测试很费事,能否批量测试?当然可以,依靠duckdb的glob函数我们很容易写出以下语句
select 'copy(from read_sheet('''||file||''')) to '''||replace(file,'.xlsx','.xls')||''';' from glob('.\libxlsxwriter\test\functional\xlsx_files\*.xlsx') limit 2;
运行该查询,返回两行数据,每行都是一个查询read_sheet()的语句:
copy(from read_sheet('.\libxlsxwriter\test\functional\xlsx_files\array_formula01.xlsx')) to '.\libxlsxwriter\test\functional\xlsx_files\array_formula01.xls';
copy(from read_sheet('.\libxlsxwriter\test\functional\xlsx_files\array_formula02.xlsx')) to '.\libxlsxwriter\test\functional\xlsx_files\array_formula02.xls';
只要把该语句的输出写入一个脚本文件,用.read命令读入脚本就实现了全自动测试,为了防止存在相同的列标题报错,加入header=0参数。
完整语句如下:
.header off
.mode list
.output out.txtselect 'copy(from read_sheet('''||file||''',header=0)) to '''||replace(file,'.xlsx','.xls')||''';' from glob('.\libxlsxwriter\test\functional\xlsx_files\*.xlsx');.output.read out.txt
还真被我测试出一些问题。
比如
Binder Error:
Read spreadsheet failed: Empty sheet or missing data
和
Invalid Input Error:
Read spreadsheet failed: Invalid cell value at 'A1': #VALUE!
以及
Invalid Input Error:
Read spreadsheet failed: Invalid cell value at 'A2': #DIV/0!
想要捕捉出错的文件,可以在每两个语句之间插入文件名标记,像这样, 只要用它替换上面完整语句中间那一句就行了。注意去掉limit 2。
select 'copy(from read_sheet('''||file||''',header=0)) to '''||replace(file,'.xlsx','.xls')||''';'||chr(10)||'select '''||file||''';' from glob('.\libxlsxwriter\test\functional\xlsx_files\*.xlsx')limit 2;
输出
copy(from read_sheet('.\libxlsxwriter\test\functional\xlsx_files\array_formula01.xlsx',header=0)) to '.\libxlsxwriter\test\functional\xlsx_files\array_formula01.xls';
select '.\libxlsxwriter\test\functional\xlsx_files\array_formula01.xlsx';
copy(from read_sheet('.\libxlsxwriter\test\functional\xlsx_files\array_formula02.xlsx',header=0)) to '.\libxlsxwriter\test\functional\xlsx_files\array_formula02.xls';
select '.\libxlsxwriter\test\functional\xlsx_files\array_formula02.xlsx';
这样错在哪个文件就明确了。