展示型網(wǎng)站舉例seo專員崗位職責(zé)
PGlite 是一款基于 WebAssembly(WASM)構(gòu)建的輕量級(jí) PostgreSQL 數(shù)據(jù)庫引擎,旨在簡(jiǎn)化開發(fā)者在瀏覽器、Node.js、Bun 或 Deno 環(huán)境中運(yùn)行 PostgreSQL。PGlite 無需復(fù)雜的安裝或配置,特別適合開發(fā)測(cè)試、本地化應(yīng)用及快速原型設(shè)計(jì)。
一個(gè)完整的 PGlite 代碼庫壓縮之后不到 3 MB,但是可以支持大量 PostgreSQL 擴(kuò)展插件,包括向量數(shù)據(jù)庫 pgvector。
PGlite 支持 Node、Bun、Deno、瀏覽器以及任何 JavaScript 框架,不同環(huán)境的安裝方式如下:
-- npm
npm install @electric-sql/pglite-- pnpm
pnpm install @electric-sql/pglite-- yarn
yarn add @electric-sql/pglite-- bun
bun install @electric-sql/pglite-- deno
deno add npm:@electric-sql/pglite
創(chuàng)建數(shù)據(jù)庫的方式如下:
import { PGlite } from '@electric-sql/pglite'const db = new PGlite() -- 使用內(nèi)存存儲(chǔ)const db = new PGlite('./path/to/pgdata') -- 使用文件系統(tǒng)存儲(chǔ)
對(duì)于瀏覽器嵌入,安裝后使用如下方式導(dǎo)入并創(chuàng)建數(shù)據(jù)庫:
import { PGlite } from "@electric-sql/pglite"; -- 導(dǎo)入模塊const db = new PGlite() -- 使用內(nèi)存存儲(chǔ)
const db = new PGlite('idb://my-pgdata') -- 使用IndexedDB存儲(chǔ)await db.query("select 'Hello world' as message;") -- 執(zhí)行查詢
// -> { rows: [ { message: "Hello world" } ] }
接下來可以使用 .exec 方法創(chuàng)建表和數(shù)據(jù):
await db.exec(`CREATE TABLE IF NOT EXISTS todo (id SERIAL PRIMARY KEY,task TEXT,done BOOLEAN DEFAULT false);INSERT INTO todo (task, done) VALUES ('Install PGlite from NPM', true);INSERT INTO todo (task, done) VALUES ('Load PGlite', true);INSERT INTO todo (task, done) VALUES ('Create a table', true);INSERT INTO todo (task, done) VALUES ('Insert some data', true);INSERT INTO todo (task) VALUES ('Update a task');
`)
然后使用 .query 方法查詢數(shù)據(jù):
const ret = await db.query(`SELECT * from todo WHERE id = 1;
`)
console.log(ret.rows)
查詢返回的結(jié)果如下:
;[{id: 1,task: 'Install PGlite from NPM',done: false,},
]
以下是一個(gè)利用 pgvector 插件進(jìn)行相似度搜索的示例:
import { PGlite } from "@electric-sql/pglite";
import { vector } from "@electric-sql/pglite/vector";const pg = new PGlite({extensions: {vector,// Alternatively, you can specify the path to the extension tarball// vector: new URL("../dist/vector.tar.gz", import.meta.url),}
});await pg.exec("CREATE EXTENSION IF NOT EXISTS vector;");
await pg.exec(`CREATE TABLE IF NOT EXISTS test (id SERIAL PRIMARY KEY,name TEXT,vec vector(3));
`);
await pg.exec("INSERT INTO test (name, vec) VALUES ('test1', '[1,2,3]');");
await pg.exec("INSERT INTO test (name, vec) VALUES ('test2', '[4,5,6]');");
await pg.exec("INSERT INTO test (name, vec) VALUES ('test3', '[7,8,9]');");const res = await pg.exec(`SELECT * FROM test;
`);
console.log(res);const res2 = await pg.exec(`SELECTname,vec,vec <-> '[3,1,2]' AS distanceFROM test;
`);
console.log(res2);
以上代碼輸出的結(jié)果如下:
[{"rows": [{"id": 1,"name": "test1","vec": "[1,2,3]"},{"id": 2,"name": "test2","vec": "[4,5,6]"},{"id": 3,"name": "test3","vec": "[7,8,9]"}],"fields": [{"name": "id","dataTypeID": 23},{"name": "name","dataTypeID": 25},{"name": "vec","dataTypeID": 16385}],"affectedRows": 0}
]
[{"rows": [{"name": "test1","vec": "[1,2,3]","distance": 2.449489742783178},{"name": "test2","vec": "[4,5,6]","distance": 5.744562646538029},{"name": "test3","vec": "[7,8,9]","distance": 10.677078252031311}],"fields": [{"name": "name","dataTypeID": 25},{"name": "vec","dataTypeID": 16385},{"name": "distance","dataTypeID": 701}],"affectedRows": 0}
]
PGlite 還支持許多高級(jí)功能,例如實(shí)時(shí)查詢(live 插件)、持久化文件系統(tǒng)、框架集成(React、Vue)、嵌入式命令行(REPL)、實(shí)時(shí)遠(yuǎn)程數(shù)據(jù)同步(pglite-sync)等,相關(guān)示例建議參考官方文檔:
https://pglite.dev/docs/