我有一個用例,我想使用 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:
有人可以建議我如何做到這一點。
uj5u.com熱心網友回復:
看來您正在努力將您的 JSON 扁平化為命令上的一行,這可能適用于少量資料,但您可能只是太大了。
恕我直言,在命令列上發送大型 JSON 檔案似乎是錯誤的(因為 Linux 中存在命令列限制),您可能會查看一些限制
getconf ARG_MAX
但是對于命令列上真正的單個引數限制,請查看 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://json-datasets.zeef.com/jdorfman' -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"
其他一些想法...
如果您堅持使用 jq 進行壓縮,則命令 jq 默認情況下會為輸出著色,使用 -M 標志。
您的存盤桶雖然具有合法名稱 `com.src.test.default`,但使用“.” 7.0 版本中的字符將是 `com.src.test.default`._default._default 的鍵空間。存盤桶名稱中的點讓我有點困惑。請注意,當您升級時,我們使用 bucketname.scope.collection,您的 7.0 之前的資料將自動遷移到 bucketname._default._default
您可以考慮使用 SDK 并用您喜歡的語言撰寫一個簡單的程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/408226.html
標籤:
