0

从我的 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>

不幸的是,这会导致以下错误消息。

错误:未知命令或无效参数:“分隔符”。输入“.help”获取帮助

我正在尝试做的正确语法是什么?

最终解决方案:

<exec executable="sqlite3" inputstring=".separator ';'&#10;.import ${data.dir}/METADATA_DESCRIPTION.txt METADATA_DESCRIPTION">
    <arg value="${sqlite.db}" />
</exec>
4

2 回答 2

1

看来您不能通过最后一个参数将元命令(即以 a 开头的命令.)传递给 sqlite3;只有实际的 SQL 语句似乎在那里工作[*]。有两种可能的修复方法;要么将元命令写入文件并使用-file filename选项(两个参数,在数据库名称之前)加载它们,要么在 sqlite3 的标准输入中传递整个多语句指令集。第二个选项应该更简单,您可以通过inputstring参数使用 ant 实现:

<exec executable="sqlite3" inputstring=".separator ';'
.import ${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY">
    <arg value="${sqlite.db}" />
</exec>

是的,里面有一个真正的换行符。与真正的 SQL 语句不同,您不能用分号分隔元命令。您可以根据需要对换行符进行编码&#10;


[*] 实际上,一个元命令可以工作,但你不能放两个。

于 2012-05-05T23:05:48.583 回答
0

我认为 Ant 将您的第二个 arg 值中的单引号解释为字符串分隔符。尝试转义单引号:

<arg value=".separator \';\'\n.import${data.dir}/DISTRICT_BOUNDARY.txt DISTRICT_BOUNDARY" />

我不熟悉 SQLite 语法,但 .import 参数可能还需要是一个单独的 arg 值。

于 2012-05-05T21:09:48.473 回答