RDB.js:适用于 Node.js 和 Typescript 的终极对象关系映射器

RDB.js 是适用于 Node.js 和 Typescript 的终极对象关系映射器,可与 Postgres、MS SQL、MySQL、Sybase SAP 和 SQLite 等流行数据库无缝集成。无论您是使用 TypeScript 还是 JavaScript(包括 CommonJS 和 ECMAScript)构建应用程序,RDB 都能满足您的需求。

RDB.js:https://rdbjs.org/

关键特性

  • 丰富的查询模式:RDB 提供了强大而直观的查询模型,可轻松检索、过滤和操作数据库中的数据。
  • 简明 API:RDB 拥有简明且便于开发人员使用的 API,可让您使用简单而富有表现力的语法与数据库进行交互。
  • 无需代码生成:享受完整的智能感知,即使在表映射中,也不需要繁琐的代码生成。
  • 支持 TypeScript 和 JavaScript:RDB 完全支持 TypeScript 和 JavaScript,让您可以充分利用静态类型和现代 ECMAScript 功能的优势。
  • 可在浏览器中使用:通过使用 Express.js 插件,您可以在浏览器中安全地使用 RDB,该插件用于保护敏感的数据库凭据,避免在客户端级别暴露。这个方法反映了传统的 REST API,并使用了高级 TypeScript 工具来增强功能。

安装与使用

shell 复制代码
$ npm install rdb

示例

这里我们选择 SQLite。

shell 复制代码
npm install sqlite3

map.js

js 复制代码
import rdb from "rdb";

const map = rdb
  .map((x) => ({
    customer: x.table("customer").map(({ column }) => ({
      id: column("id")
        .numeric()
        .primary()
        .notNullExceptInsert(),
      name: column("name").string(),
      balance: column("balance").numeric(),
      isActive: column("isActive").boolean(),
    })),

    order: x.table("_order").map(({ column }) => ({
      id: column("id")
        .numeric()
        .primary()
        .notNullExceptInsert(),
      orderDate: column("orderDate").date().notNull(),
      customerId: column("customerId")
        .numeric()
        .notNullExceptInsert(),
    })),

    orderLine: x.table("orderLine").map(({ column }) => ({
      id: column("id").numeric().primary(),
      orderId: column("orderId").numeric(),
      product: column("product").string(),
    })),

    deliveryAddress: x
      .table("deliveryAddress")
      .map(({ column }) => ({
        id: column("id").numeric().primary(),
        orderId: column("orderId").numeric(),
        name: column("name").string(),
        street: column("street").string(),
        postalCode: column("postalCode").string(),
        postalPlace: column("postalPlace").string(),
        countryCode: column("countryCode").string(),
      })),
  }))
  .map((x) => ({
    order: x.order.map((v) => ({
      customer: v.references(x.customer).by("customerId"),
      lines: v.hasMany(x.orderLine).by("orderId"),
      deliveryAddress: hasOne(x.deliveryAddress).by(
        "orderId"
      ),
    })),
  }));

export default map;

update.js

js 复制代码
import map from "./map";
const db = map.sqlite("demo.db");

updateRow();

async function updateRow() {
  const order = await db.order.getById(2, {
    lines: true,
  });
  order.lines.push({
    product: "broomstick",
  });

  await order.saveChanges();
}

filter.js

js 复制代码
import map from "./map";
const db = map.sqlite("demo.db");

getRows();

async function getRows() {
  const filter = db.order.lines
    .any((line) => line.product.contains("broomstick"))
    .and(db.order.customer.name.startsWith("Harry"));

  const orders = await db.order.getMany(filter, {
    lines: true,
    deliveryAddress: true,
    customer: true,
  });

  console.dir(orders, { depth: Infinity });
}
相关推荐
pepedd86416 分钟前
浅谈js拷贝问题-解决拷贝数据难题
前端·javascript·trae
@大迁世界18 分钟前
useCallback 的陷阱:当 React Hooks 反而拖了后腿
前端·javascript·react.js·前端框架·ecmascript
小高00720 分钟前
📌React 路由超详解(2025 版):从 0 到 1 再到 100,一篇彻底吃透
前端·javascript·react.js
Data_Adventure24 分钟前
Java 与 TypeScript 的“同名方法”之争:重载机制大起底
前端·typescript
summer77727 分钟前
GIS三维可视化-Cesium
前端·javascript·数据可视化
HWL567930 分钟前
pnpm(Performant npm)的安装
前端·vue.js·npm·node.js
Sammyyyyy1 小时前
2025年,Javascript后端应该用 Bun、Node.js 还是 Deno?
开发语言·javascript·node.js
小高0072 小时前
面试官:npm run build 到底干了什么?从 package.json 到 dist 的 7 步拆解
前端·javascript·vue.js
wayhome在哪2 小时前
用 fabric.js 搞定电子签名拖拽合成图片
javascript·产品·canvas
JayceM3 小时前
Vue中v-show与v-if的区别
前端·javascript·vue.js