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"
一些其他想法...
默认情况下,如果您坚持使用 jq 使用 -M 标志压缩,命令 jq 会将输出着色。
您的存储桶虽然具有合法名称 `com.src.test.default` 但使用“.” 7.0+ 版本中的字符将是 `com.src.test.default` 的键空间。_default._default 你存储桶名称中的点让我有点困惑。请注意,当您升级时我们使用 bucketname.scope.collection,您的 7.0+ 之前的数据将自动迁移到 bucketname。_default._default
您可以考虑使用 SDK 并用您喜欢的语言编写一个简单的程序。
我有一个用例,我想使用 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"
一些其他想法...
默认情况下,如果您坚持使用 jq 使用 -M 标志压缩,命令 jq 会将输出着色。
您的存储桶虽然具有合法名称 `com.src.test.default` 但使用“.” 7.0+ 版本中的字符将是 `com.src.test.default` 的键空间。_default._default 你存储桶名称中的点让我有点困惑。请注意,当您升级时我们使用 bucketname.scope.collection,您的 7.0+ 之前的数据将自动迁移到 bucketname。_default._default
您可以考虑使用 SDK 并用您喜欢的语言编写一个简单的程序。