从Ant脚本调用SQLite时我需要同时使用.separator和.import,但似乎无法正确使用语法。根据这里关于在bash脚本中做同样事情的答案,我的最新尝试就是这个。
<exec executable="sqlite3">
<arg value="${sqlite.db}" />
<arg value=".separator ';'\n.import ${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY" />
</exec>
不幸的是,这会导致以下错误消息。
错误:未知命令或无效参数:“separator”。输入“.help”获取帮助
我正在尝试做什么的正确语法是什么?
最终解决方案:
<exec executable="sqlite3" inputstring=".separator ';' .import ${data.dir}/METADATA_DESCRIPTION.txt METADATA_DESCRIPTION">
<arg value="${sqlite.db}" />
</exec>
答案 0 :(得分:1)
您似乎无法通过sqlite3的最终参数传递元命令(即以.
开头的命令);只有实际的SQL语句似乎在那里工作[*]。有两种可能的修复方法;或者将元命令写入文件并使用-file filename
选项(在数据库名称之前的两个参数)加载它们,或者在sqlite3的标准输入中传递整个多语句指令集。通过inputstring
参数:
<exec executable="sqlite3" inputstring=".separator ';'
.import ${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY">
<arg value="${sqlite.db}" />
</exec>
是的,它有一个真正的换行符。与真正的SQL语句不同,您不能使用分号分隔元命令。如果您愿意,可以将换行编码为
。
[*]实际上,单个元命令可以工作,但你不能放两个。
答案 1 :(得分:0)
我认为Ant将第二个arg值中的单引号解释为字符串分隔符。尝试转义单引号:
<arg value=".separator \';\'\n.import${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY" />
我不熟悉SQLite语法,但.import参数可能也需要是一个单独的arg值。