在 React App 中使用或不使用 PouchDB 加载预构建的 SQlite 数据库的正确方法是什么
What is the correct way to load prebuilt SQlite databases with or without PouchDB in a React App
目前我正在编写一个 React 应用程序,并且正在努力从 SQlite 数据库中进行简单的读取。
因问题不明而编辑:
***目标是在没有任何后端的情况下从数据库中读取,因为即使离线也需要从数据库中读取。
***我的目标是一次性文件转换,然后离线查询 pouchdb。但我不想手动进行,因为大约有 6k+ 个注册表。
*** 或 SQL 从没有任何 API 的浏览器查询,但我需要支持 Internet Explorer,因此 WebSQL 不是一个选项。我试过 sqlite3 库,但我无法让它与 Create React App 一起使用。
我尝试的解决方案是使用 PouchDB 读取文件,但我得出的结论是,如果不使用cordova(我不喜欢它,我不想要任何服务器 运行),甚至不需要某种适配器。
那么这是正确的做事方式吗?
有什么方法可以不丢失我的 .db 数据,而必须手动将其全部转换?
我应该忘记在 IE 上支持此功能吗?
谢谢:)
由于 Couch/Pouch-DB 是面向文档的数据库,所有记录又名文档,因此只有 JSON 又名 JS 对象。在我的 RN 应用程序中,当我遇到类似的任务时,我只是将我想成为 "prepopulated" 的所有文档放在 PouchDB 中的一个 JS 对象数组中,将其作为模块导入到我的应用程序中,然后在应用程序初始化期间将它们写入 PDB 作为必要的文件。这就是所有的预填充。如何将您的 SQL 数据库记录导出到 JSON - 您决定,当然这取决于您希望在 PDB 中的源数据库结构和数据逻辑。
试试这个:
sqlite3 example "DROP TABLE IF EXISTS some_table;";
sqlite3 example "CREATE TABLE IF NOT EXISTS some_table (id INTEGER PRIMARY KEY AUTOINCREMENT, anattr VARCHAR, anotherattr VARCHAR);";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '1stAttr', 'AttrA');";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '2ndAttr', 'AttrB');";
## Create three JSON fragment files
sqlite3 example ".output result_prefix.json" "SELECT '{ \"docs\": ['";
sqlite3 example ".output rslt.json" "SELECT '{ \"_id\": \"someTable_' || SUBSTR(\"000000000\" || id, LENGTH(\"000000000\" || id) - 8, 9) || '\", \"anattr\": \"' || anattr || '\", \"anotherattr\": \"' || anotherattr || '\" },' FROM some_table;";
sqlite3 example ".output result_suffix.json" "SELECT '] }'";
## strip trailing comma of last record
sed -i '$ s/.$//' rslt.json;
## concatenate to a single file
cat result_prefix.json rslt.json result_suffix.json > result.json;
cat result.json;
您应该能够简单地将上面的行粘贴到 (unix) 命令行,看到输出:
{ "docs": [
{ "_id": "someTable_000000001", "anattr": "1stAttr", "anotherattr": "AttrA" },
{ "_id": "someTable_000000002", "anattr": "2ndAttr", "anotherattr": "AttrB" }
] }
如果您安装了 jq
,您可以改为...
cat result.json | jq .
...获取:
{
"docs": [
{
"_id": "someTable_000000001",
"anattr": "1stAttr",
"anotherattr": "AttrA"
},
{
"_id": "someTable_000000002",
"anattr": "2ndAttr",
"anotherattr": "AttrB"
}
]
}
您将在博客 post Prebuilt databases with PouchDB.
的第 2 部分找到一个示例,说明如何快速从 JSON 文件初始化 PouchDB
因此,如果您有可用的 CouchDB 服务器,您可以执行以下操作;
export COUCH_DB=example;
export COUCH_URL= *** specify yours here ***;
export FILE=result.json;
## Drop database
curl -X DELETE ${COUCH_URL}/${COUCH_DB};
## Create database
curl -X PUT ${COUCH_URL}/${COUCH_DB};
## Load database from JSON file
curl -H "Content-type: application/json" -X POST "${COUCH_URL}/${COUCH_DB}/_bulk_docs" -d @${FILE};
## Extract database with meta data to PouchDB initialization file
pouchdb-dump ${COUCH_URL}/${COUCH_DB} > example.json
## Inspect PouchDB initialization file
cat example.json | jq .
显然您需要进行一些调整,但以上应该不会给您带来任何问题。
目前我正在编写一个 React 应用程序,并且正在努力从 SQlite 数据库中进行简单的读取。
因问题不明而编辑:
***目标是在没有任何后端的情况下从数据库中读取,因为即使离线也需要从数据库中读取。
***我的目标是一次性文件转换,然后离线查询 pouchdb。但我不想手动进行,因为大约有 6k+ 个注册表。
*** 或 SQL 从没有任何 API 的浏览器查询,但我需要支持 Internet Explorer,因此 WebSQL 不是一个选项。我试过 sqlite3 库,但我无法让它与 Create React App 一起使用。
我尝试的解决方案是使用 PouchDB 读取文件,但我得出的结论是,如果不使用cordova(我不喜欢它,我不想要任何服务器 运行),甚至不需要某种适配器。
那么这是正确的做事方式吗?
有什么方法可以不丢失我的 .db 数据,而必须手动将其全部转换?
我应该忘记在 IE 上支持此功能吗?
谢谢:)
由于 Couch/Pouch-DB 是面向文档的数据库,所有记录又名文档,因此只有 JSON 又名 JS 对象。在我的 RN 应用程序中,当我遇到类似的任务时,我只是将我想成为 "prepopulated" 的所有文档放在 PouchDB 中的一个 JS 对象数组中,将其作为模块导入到我的应用程序中,然后在应用程序初始化期间将它们写入 PDB 作为必要的文件。这就是所有的预填充。如何将您的 SQL 数据库记录导出到 JSON - 您决定,当然这取决于您希望在 PDB 中的源数据库结构和数据逻辑。
试试这个:
sqlite3 example "DROP TABLE IF EXISTS some_table;";
sqlite3 example "CREATE TABLE IF NOT EXISTS some_table (id INTEGER PRIMARY KEY AUTOINCREMENT, anattr VARCHAR, anotherattr VARCHAR);";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '1stAttr', 'AttrA');";
sqlite3 example "INSERT INTO some_table VALUES (NULL, '2ndAttr', 'AttrB');";
## Create three JSON fragment files
sqlite3 example ".output result_prefix.json" "SELECT '{ \"docs\": ['";
sqlite3 example ".output rslt.json" "SELECT '{ \"_id\": \"someTable_' || SUBSTR(\"000000000\" || id, LENGTH(\"000000000\" || id) - 8, 9) || '\", \"anattr\": \"' || anattr || '\", \"anotherattr\": \"' || anotherattr || '\" },' FROM some_table;";
sqlite3 example ".output result_suffix.json" "SELECT '] }'";
## strip trailing comma of last record
sed -i '$ s/.$//' rslt.json;
## concatenate to a single file
cat result_prefix.json rslt.json result_suffix.json > result.json;
cat result.json;
您应该能够简单地将上面的行粘贴到 (unix) 命令行,看到输出:
{ "docs": [
{ "_id": "someTable_000000001", "anattr": "1stAttr", "anotherattr": "AttrA" },
{ "_id": "someTable_000000002", "anattr": "2ndAttr", "anotherattr": "AttrB" }
] }
如果您安装了 jq
,您可以改为...
cat result.json | jq .
...获取:
{
"docs": [
{
"_id": "someTable_000000001",
"anattr": "1stAttr",
"anotherattr": "AttrA"
},
{
"_id": "someTable_000000002",
"anattr": "2ndAttr",
"anotherattr": "AttrB"
}
]
}
您将在博客 post Prebuilt databases with PouchDB.
的第 2 部分找到一个示例,说明如何快速从 JSON 文件初始化 PouchDB因此,如果您有可用的 CouchDB 服务器,您可以执行以下操作;
export COUCH_DB=example;
export COUCH_URL= *** specify yours here ***;
export FILE=result.json;
## Drop database
curl -X DELETE ${COUCH_URL}/${COUCH_DB};
## Create database
curl -X PUT ${COUCH_URL}/${COUCH_DB};
## Load database from JSON file
curl -H "Content-type: application/json" -X POST "${COUCH_URL}/${COUCH_DB}/_bulk_docs" -d @${FILE};
## Extract database with meta data to PouchDB initialization file
pouchdb-dump ${COUCH_URL}/${COUCH_DB} > example.json
## Inspect PouchDB initialization file
cat example.json | jq .
显然您需要进行一些调整,但以上应该不会给您带来任何问题。