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 });
}
相关推荐
Southern Wind18 小时前
Vue 3 多实例 + 缓存复用:理念及实践
前端·javascript·vue.js·缓存·html
前端拿破轮19 小时前
从0到1搭一个monorepo项目(一)
前端·javascript·git
水冗水孚19 小时前
fastify-sse-v2搭配EventSource实现SSE中的AI流式回复打字机效果&Fetch+ReadableStream+Chunked分块也可实现
node.js
小于小于091219 小时前
npx 与 npm 区别
前端·npm·node.js
Mintopia19 小时前
🎨 AIGC 内容过滤技术:当创作的洪流遇上理性的堤坝
前端·javascript·aigc
Shi_haoliu20 小时前
Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
前端·javascript·vue.js·node.js·html·excel·office
aesthetician1 天前
Node.js v25 重磅发布!革新与飞跃:深入探索 JavaScript 运行时的未来
javascript·node.js·vim
demi_meng1 天前
reactNative 遇到的问题记录
javascript·react native·react.js
千码君20161 天前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
代码搬运媛1 天前
【架构相关】tsconfig.json 与 tsconfig.node.json、tsconfig.app.json 的关系和作用
node.js·json