curl 命令将文件中的数据上传到 couchbase 存储桶

curl command to upload data from a file to couchbase bucket

我有一个用例,我想使用 CURL 命令将 json 数据从文件上传到 couchbase 存储桶。

我正在使用以下命令

curl -v localhost:8093/query/service -u Administrator:${password} -d 'statement=INSERT INTO `com.src.test.default` (KEY, VALUE) VALUES ( "'$docId'" , '`jq -c . local.json`');'

但是,使用上面的命令,只能传输小文件,否则会出现这样的错误,但是 json 格式是好的:

curl: (3) unmatched close brace/bracket in URL position 216:

谁能建议我怎么做。

看来您正在努力将 JSON 扁平化为命令中的一行,这可能适用于少量数据,但您可能变得太大了。

恕我直言,在命令行上发送大型 JSON 文件似乎是错误的(因为 Linux 中有命令行限制),您可能会查看一些限制

    getconf ARG_MAX

但是对于命令行上的真正单个 arg 限制,请查看 MAX_ARG_STRLEN,对于我的 debian 系统,它是来自“binfmts.h”

的 131072

所以只需测试 WRT 参数长度就可以执行以下操作

    /bin/echo "$(printf "%*s" 131071 ".")">/dev/null

    /bin/echo "$(printf "%*s" 131072 ".")">/dev/null
    -bash: /bin/echo: Argument list too long

我需要一些中等大的数据所以我只是从网上抓了一些来测试

    curl 'https://data.ny.gov/api/views/pxa9-czw8/rows.json?accessType=DOWNLOAD&utm_medium=referral&utm_campaign=ZEEF&utm_source=https%3A%2F%2Fjson-datasets.zeef.com%2Fjdorfman' -o local.json

    ls -ltr local.json
    -rw-r--r-- 1 linuxbrew linuxbrew 251492 Jan 10 10:28 local.json

如果您执行以下操作会怎么样 not $keyspace 只是您的奇怪命名的存储桶 com.src.test.default:

    echo 'statement=INSERT INTO `'$keyspace'` (KEY, VALUE) VALUES ( "'$docId'",' > tmp.cmd
    cat local.json >> tmp.cmd
    echo ');' >> tmp.cmd

    curl -v localhost:8093/query/service -u ${username}:${password} -d @./tmp.cmd

但是既然你正在使用 curl 为什么不使用 cbimport?您只需执行以下操作:

    jq -c -M . local.json > tmp.json
    /opt/couchbase/bin/cbimport json -c localhost -b "com.src.test.default"  -f lines -g $docId  -d file://./tmp.json

您可以使用的另一种方法:

    cat local.json | /opt/couchbase/bin/cbc-create --username $username --password $password --spec 'couchbase://localhost/com.src.test.default' "$docID"

一些其他想法...

  1. 默认情况下,如果您坚持使用 jq 使用 -M 标志压缩,命令 jq 会将输出着色。

  2. 您的存储桶虽然具有合法名称 `com.src.test.default` 但使用“.” 7.0+ 版本中的字符将是 `com.src.test.default` 的键空间。_default._default 你存储桶名称中的点让我有点困惑。请注意,当您升级时我们使用 bucketname.scope.collection,您的 7.0+ 之前的数据将自动迁移到 bucketname。_default._default

  3. 您可以考虑使用 SDK 并用您喜欢的语言编写一个简单的程序。