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 工具来增强功能。

安装与使用

$ npm install rdb

示例

这里我们选择 SQLite。

npm install sqlite3

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

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

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 });
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ceres 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概念理解 Part.II 简单使用Chap.I Ceres 中主要函数简介Chap.II 一个简单的实例 Reference Part.I Introduction Ceres 1 是由 Google 开发的开源 C 通用非线性优化库,与 g2o 并列为目前视觉 SLAM 中应用最广泛…

使用 conda 在 Ubuntu 16.04 上安装 Python 3.9 的步骤:和 VSCode配置

一、使用conda在 Ubuntu 16.04 上安装 Python 3.9 的步骤: 当然可以,conda 是一个非常强大的包管理器,它可以方便地管理不同版本的 Python 和各种库包。以下是使用 conda 在 Ubuntu 16.04 上安装 Python 3.9 的步骤: 1. 安装 Miniconda Miniconda 是 Anaconda 的轻量级版…

k8s-----3、kubernetes集群部署(kubeadm部署)

集群部署 1、kubeadm流程(重新配置)1.1 安装要求1.2 准备环境 1.3. 所有节点安装Docker/kubeadm/kubelet1.3.1 安装Docker1.3.2 添加阿里云YUM软件源1.3.3 安装kubeadm,kubelet和kubectl 1.4 部署Kubernetes Master1.5. 加入Kubernetes Node1…

springboot+vue开发的视频弹幕网站动漫网站

springbootvue开发的视频弹幕网站动漫网站 演示视频 https://www.bilibili.com/video/BV1MC4y137Qk/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 功能: 前台: 首页(猜你喜欢视频推荐)、轮播图、分类…

28、Flink 的SQL之DROP 、ALTER 、INSERT 、ANALYZE 语句

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

cookie过大导致request 400 错误研究

问:get请求太长报400的错误,如何解决?生成系统中经常偶现此问题 问:get请求URL的长度是谁限制的? 问:每一个cookie的value的大小还是同域下cookie的个数做的限制? 现象:出现 400 Ba…

【Python · PyTorch】数据基础

数据基础 1. 数据操作1.1 入门1.2 运算符1.3 广播机制1.4 索引和切片1.5 节省内存1.6 转化为其他Python对象 2. 数据预处理2.1 读取数据集2.2 处理缺失值2.3 转换为张量格式 本文介绍了PyTorch数据基础,Python版本3.9.0,代码于Jupyter Lab中运行&#xf…

人工智能之深度学习

1. 引言 时至今日,人们常用的计算机程序几乎都是软件开发人员从零编写的。 比如,现在开发人员要编写一个程序来管理网上商城。 经过思考,开发人员可能提出如下一个解决方案: 首先,用户通过Web浏览器(或移动…

Elasticsearch的聚集统计,可以进行各种统计分析

说明: Elasticsearch不仅是一个大数据搜索引擎,也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。 度量聚集(Metric aggregation):度量聚集可以用于计算搜…

MyBatisPlus的使用【详细】

目录 Mybatis MybatisPlus特性 MybatisPlus的使用 常见注解 TableName TableId TableField MP常见配置 条件查询器Wrapper QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL Service接口 批量添加数据 MP的代码生成 MP静态工具 MP扩展功能之逻辑删除…

防火墙实验

防火墙 ping(网络测试工具,测试主机之间的可达性)原理: 发送一些小的网络数据包(ICMP数据包)到目标主机,并等待目标主机返回一个响应(通常是回显应答 Echo Reply)。 ss…

C++栈、队列、优先级队列模拟+仿函数

目录 一、栈的模拟和deque容器 1.deque 1.1deque结构 1.2deque优缺点 2.stack模拟 二、队列的模拟 三、priority_queue优先级队列 1.优先级队列模拟 2.添加仿函数 一、栈的模拟和deque容器 在之前,我们学过了C语言版本的栈,可以看这篇文章 栈和…

力扣:136. 只出现一次的数字(Python3)

题目: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 来源:力扣…

【刷题篇】笔试真题

文章目录 复数乘法一年中的第几天字符串相加字符串相乘 复数乘法 复数 可以用字符串表示,遵循 “实部虚部i” 的形式,并满足下述条件: 实部 是一个整数,取值范围是 [-100, 100] 虚部 也是一个整数,取值范围是 [-100, 1…

MySQL字段加密方案 安当加密

要通过安当KSP密钥管理系统实现MySQL数据库字段的加密,您可以按照以下步骤进行操作: 安装和配置安当KSP密钥管理系统:首先,您需要安装安当KSP密钥管理系统,并按照说明进行配置。确保您已经正确地设置了密钥管理系统的用…

C语言知识回顾

链接:https://pan.baidu.com/s/1CiB1Ydm4LTV6hZE8wx0VFw?pwdna4z 提取码:na4z --来自百度网盘超级会员V6的分享

1024程序员节——我是猿,我为自己带盐

目录 写在前面 1.我们的着装 2.我们善于学习 3.我们善于解决问题 4.我们很单纯 5.我们喜欢聆听 6.我们很有创造力 7.我们善于分享 8.我们很细心 9.和我们约会的好处 10.活捉程序员的技巧 11.值此1024程序员节,我们的愿望 12.附上程序员装逼指南 写在最…

判断过/欠拟合和学习率

一、说明 这篇博客是判断是否过拟合和学习率大小的问题,并没有给出解决办法。因为每个人的网络模型不一样,解决办法也不同。因此,如果需要解决办法的话,请参考其他博客。 二、拟合问题 1.train_loss 不断下降,test_los…

RSA加密算法Python实现

本文将从RSA加密算法的基本原理、Python实现RSA加密算法的步骤、实现过程中可能出现的问题、代码示例等多个方面对RSA加密算法Python实现进行详细阐述。 一、RSA加密算法基本原理 RSA加密算法是一种公钥加密算法,由三位数学家Rivest、Shamir和Adleman于1978年提出…

【Linux系统编程:信号】产生信号 | 阻塞信号 | 处理信号 | 可重入函数

写在前面 通过学习信号可以理解进程与进程的一个相对关系,还能理解操作系统与进程的关系。要注意的是进程间通信中的信号量与这里的信号没有半毛钱关系,就像老婆和老婆饼。 本文要点: 掌握 Linux 信号的基本概念掌握信号产生的一般方式理解…