当前位置: 首页 > news >正文

PGlite:浏览器中运行的PostgreSQL

PGlite 是一款基于 WebAssembly(WASM)构建的轻量级 PostgreSQL 数据库引擎,旨在简化开发者在浏览器、Node.js、Bun 或 Deno 环境中运行 PostgreSQL。PGlite 无需复杂的安装或配置,特别适合开发测试、本地化应用及快速原型设计。

在这里插入图片描述

一个完整的 PGlite 代码库压缩之后不到 3 MB,但是可以支持大量 PostgreSQL 扩展插件,包括向量数据库 pgvector。

PGlite 支持 Node、Bun、Deno、浏览器以及任何 JavaScript 框架,不同环境的安装方式如下:

-- 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

创建数据库的方式如下:

import { PGlite } from '@electric-sql/pglite'

const db = new PGlite() -- 使用内存存储

const db = new PGlite('./path/to/pgdata') -- 使用文件系统存储

对于浏览器嵌入,安装后使用如下方式导入并创建数据库:

import { PGlite } from "@electric-sql/pglite"; -- 导入模块

const db = new PGlite() -- 使用内存存储
const db = new PGlite('idb://my-pgdata') -- 使用IndexedDB存储

await db.query("select 'Hello world' as message;") -- 执行查询
// -> { rows: [ { message: "Hello world" } ] }

接下来可以使用 .exec 方法创建表和数据:

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 方法查询数据:

const ret = await db.query(`
  SELECT * from todo WHERE id = 1;
`)
console.log(ret.rows)

查询返回的结果如下:

;[
  {
    id: 1,
    task: 'Install PGlite from NPM',
    done: false,
  },
]

以下是一个利用 pgvector 插件进行相似度搜索的示例:

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(`
  SELECT
    name,
    vec,
    vec <-> '[3,1,2]' AS distance
  FROM test;
`);
console.log(res2);

以上代码输出的结果如下:

[
  {
    "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 还支持许多高级功能,例如实时查询(live 插件)、持久化文件系统、框架集成(React、Vue)、嵌入式命令行(REPL)、实时远程数据同步(pglite-sync)等,相关示例建议参考官方文档:

https://pglite.dev/docs/

相关文章:

  • ‌Vetur‌ 与 Vue-Official 的区别
  • Leetcode 316 去除重复字母
  • 第10篇:文件IO与数据持久化(下)(JSON、二进制文件)
  • 塔能物联运维:城市照明运维成本的破局之道
  • Python:全方位赋能,开启科技前沿无限可能
  • win32汇编环境,窗口程序中使控件子类化的示例一
  • 使用Linux服务器搭建。
  • (十 九)趣学设计模式 之 中介者模式!
  • Linux IO编程核心要点解析:文件、流与缓冲区实战指南
  • 多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标
  • 从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
  • QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
  • 使用vue3+element plus 的table自制的穿梭框(支持多列数据)
  • 【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
  • Linux下安装VS Code
  • HOW - 在Windows浏览器中模拟MacOS的滚动条
  • 栈和队列的模拟实现
  • 从暴力破解到时空最优:LeetCode算法设计核心思维解密
  • Metal学习笔记十:光照基础
  • 【jenkins配置记录】
  • 设计说明室内设计/seo推广软件排名
  • 吴江住房城乡建设局网站/今日足球赛事分析推荐
  • 深圳个人做网站/做竞价推广大概多少钱
  • wordpress页面归档/站长工具之家seo查询
  • asp.net sql server网站建设 pdf/网络营销有哪几种方式
  • 网站制作需要什么/个人网页免费域名注册入口