【问题标题】:curl command to upload data from a file to couchbase bucketcurl命令将数据从文件上传到couchbase存储桶
【发布时间】:2022-01-09 13:40:55
【问题描述】:

我有一个用例,我想使用 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:

有人可以建议我如何做到这一点。

【问题讨论】:

  • 错误信息不是自我描述的吗?你必须平衡报价。
  • 在 local.json 中?但是文件的语法都很好。
  • 那么第 216 位是什么?

标签: json curl command-line-interface couchbase libcurl


【解决方案1】:

您似乎正在努力将您的 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

如果你做了以下不是 $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 进行压缩,则默认情况下命令 jq 会为输出着色,使用 -M 标志。

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

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

【讨论】:

  • 使用 cbimport 是最好的选择,但是由于工作场所的一些限制,我只应该使用 curl 命令。我还将探索 SDK 选项,它看起来很适合长期使用。谢谢。
猜你喜欢
  • 2018-06-08
  • 2018-02-07
  • 2021-06-20
  • 2020-04-02
  • 2016-05-04
  • 2018-04-25
  • 1970-01-01
  • 2017-03-02
  • 2022-10-09
相关资源
最近更新 更多