Ty p e O R M框架

TypeORM是一个支持多种数据库的ORM框架,适用于NodeJS及其衍生平台,支持DataMapper和ActiveRecord模式。它提供了实体管理、关联、事务、迁移、查询构建器等功能。安装TypeORM需要npm和相应的数据库驱动,配置可通过ormconfig文件或环境变量完成。实体和列可以自定义,支持多种数据库类型和关系,如一对一、一对多、多对多等。Query Builder提供方便的SQL查询构造语法。
摘要由CSDN通过智能技术生成

认识Ty p e O R M

◼ TypeORM 是一个ORM (opens new window)框架,它可以运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、
React Native、Expo 和 Electron 平台上,可以与 TypeScript 和 JavaScript (ES5,ES6,ES7,ES8)一起使用。 它的目标
是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的
小型应用还是拥有多数据库的大型企业应用)应用程序。
◼ 不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 Active Record和 Data Mapper 模式,这意味着你
可以以最高效的方式编写高质量的、松耦合的、可扩展的、可维护的应用程序。

Ty p e O R M的特性

◼ 支持 DataMapper 和 ActiveRecord (随你选择) ◼ 实体和列
◼ 数据库特性列类型
◼ 实体管理
◼ 存储库和自定义存储库
◼ 清晰的对象关系模型
◼ 关联(关系)
◼ 贪婪和延迟关系
◼ 单向的,双向的和自引用的关系
◼ 支持多重继承模式
◼ 级联
◼ 索引
◼ 事务
◼ 迁移和自动迁移
◼ 连接池
◼ 主从复制
◼ 使用多个数据库类型
◼ 跨数据库和跨模式查询
◼ 优雅的语法,灵活而强大的 QueryBuilder
◼ 左联接和内联接
◼ 使用联查查询的适当分页
◼ 查询缓存
◼ 原始结果流
◼ 日志
◼ 监听者和订阅者(钩子)
◼ 支持闭包表模式
◼ 在模型或者分离的配置文件中声明模式
◼ json / xml / yml / env 格式的连接配置
◼ 支持 MySQL / MariaDB / Postgres / SQLite / Microsoft SQL Server / Oracle / sql.js
◼ 支持 MongoDB NoSQL 数据库
◼ 可在 NodeJS / 浏览器 / Ionic / Cordova / React Native / Expo / Electron 平台上使用
◼ 支持 TypeScript 和 JavaScript
◼ 生成高性能、灵活、清晰和可维护的代码
◼ 遵循所有可能的最佳实践
◼ 命令行工具

安装(一)

◼ 通过npm安装: ◼ npm install typeorm --save
◼ 你还需要安装 reflect-metadata:
◼ npm install reflect-metadata --save
◼ 并且需要在应用程序的全局位置导入(例如在app.ts中)
◼ import “reflect-metadata”;
◼ 你可能还需要安装 node typings(以此来使用 Node 的智能提示):
◼ npm install @types/node –save
◼ 安装数据库驱动 MySQL
◼ npm install mysql --save (也可以安装 mysql2)
◼ 此外,请确保你使用的是 TypeScript 编译器版本2.3或更高版本,并且已经在tsconfig.json中启用了以下设置: ◼ “emitDecoratorMetadata”: true,
◼ “experimentalDecorators”: true,
◼ 你可能还需要在编译器选项的lib中启用es6, ,或者从@types安装es6-shim

安装(二)

◼ 开始使用 TypeORM 的最快方法是使用其 CLI 命令生成启动项目。 只有在 NodeJS 应用程序中使用
TypeORM 时,此操作才有效。
◼ 首先全局安装 TypeORM: ◼ npm install typeorm –g ◼ 然后转到要创建新项目的目录并运行命令:
◼ typeorm init --name MyProject --database mysql
◼ 其中name是项目的名称,database是您将使用的数据库。
◼ 数据库可以是以下值之一: mysql, mariadb, postgres, sqlite, mssql, oracle, mongodb, cordova, react-native,
expo, nativescript. ◼ 你还可以在现有 node 项目上运行typeorm init,但要注意,此操作可能会覆盖已有的某些文件。

在这里插入图片描述

数据库配置文件

◼ 大多数情况下,我们希望将连接选项存储在单独的配置文件中,因为此方式使管理变得更方便和容易。 TypeORM 支
持多个配置源。你只需要在应用程序的根目录(package.json附近)中创建一个ormconfig.[format]文件存放连接配置

以下是一个简单的nmpc圆形轨迹跟踪的C代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 10 // 预测步数 #define dt 0.1 // 时间步长 // 定义车辆模型 #define L 2.5 // 车长 #define max_steer 0.5 // 最大转角 #define max_v 30.0 // 最大车速 // 定义目标轨迹 #define cx 0.0 // 圆心x坐标 #define cy 100.0 // 圆心y坐标 #define r 50.0 // 圆半径 // 定义控制器参数 #define Q1 1.0 #define Q2 1.0 #define R1 1.0 #define R2 1.0 int main() { // 初始化状态和控制量 double x = 0.0, y = 0.0, yaw = 0.0, v = 10.0, steer = 0.0; double x_pred[N+1] = {0.0}, y_pred[N+1] = {0.0}, yaw_pred[N+1] = {0.0}, v_pred[N+1] = {0.0}, steer_pred[N+1] = {0.0}; // 开始循环 for (int i = 0; i < 100; i++) { // 计算目标航向角 double tx = cx - x; double ty = cy - y; double alpha = atan2(ty, tx) - yaw; // 计算控制增量 double Lf = L / 2.0 / tan(steer); double delta = atan2(2.0 * Lf * sin(alpha), r); // 计算预测轨迹 for (int j = 0; j <= N; j++) { x_pred[j] = x + v * cos(yaw) * j * dt; y_pred[j] = y + v * sin(yaw) * j * dt; yaw_pred[j] = yaw + v / Lf * sin(delta) * j * dt; v_pred[j] = v; steer_pred[j] = delta; } // 计算控制量 double d1 = 0.0, d2 = 0.0; for (int j = 0; j <= N; j++) { d1 += pow(x_pred[j] - cx, 2) + pow(y_pred[j] - cy, 2); d2 += pow(delta - steer_pred[j], 2); } double cost = Q1 * d1 + Q2 * d2; double A[N*2], B[N*2], C[N], D[N]; for (int j = 0; j < N; j++) { A[j*2] = -v_pred[j] * sin(yaw_pred[j]); A[j*2+1] = v_pred[j] * cos(yaw_pred[j]); B[j*2] = cos(yaw_pred[j]); B[j*2+1] = sin(yaw_pred[j]); C[j] = 0.0; D[j] = 0.0; } A[N*2-2] = -v_pred[N] * sin(yaw_pred[N]); A[N*2-1] = v_pred[N] * cos(yaw_pred[N]); double S[N*2], T[N]; for (int j = 0; j < N; j++) { S[j*2] = Q1 * (x_pred[j] - cx); S[j*2+1] = Q1 * (y_pred[j] - cy); T[j] = Q2 * (delta - steer_pred[j]); } double H[(N*2+N)*2], f[N*2+N], lb[N*2+N], ub[N*2+N], Aeq[2], beq[1]; for (int j = 0; j < N*2; j++) { for (int k = 0; k < N*2; k++) { H[j*(N*2+N)+k] = R1 * B[j] * B[k] + R2 * I(j==k); } for (int k = 0; k < N; k++) { H[j*(N*2+N)+N*2+k] = R2 * B[j] * D[k]; H[(N*2+j)*(N*2+N)+k] = R2 * D[j] * B[k]; } } for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { H[(N*2+j)*(N*2+N)+N*2+k] = R2 * D[j] * D[k]; } f[N*2+j] = T[j]; lb[N*2+j] = -max_steer; ub[N*2+j] = max_steer; } for (int j = 0; j < N*2; j++) { f[j] = 0.0; lb[j] = -max_v; ub[j] = max_v; } Aeq[0] = A[N*2-1]; Aeq[1] = B[N*2-1]; beq[0] = v_pred[N] * cos(yaw_pred[N]) * dt; double solution[N*2+N]; quadprog_solve_qp(H, f, A, lb, ub, Aeq, beq, solution, N*2+N); v += solution[N*2]; steer += solution[N*2+1]; // 更新状态 x += v * cos(yaw) * dt; y += v * sin(yaw) * dt; yaw += v / Lf * sin(steer) * dt; } return 0; } // 辅助函数 double I(int i) { return i == 0 ? 1.0 : 0.0; } void quadprog_solve_qp(double *H, double *f, double *A, double *lb, double *ub, double *Aeq, double *beq, double *solution, int n) { // 使用专门的库或算法来求解二次规划问题 // 这里略去具体实现 } ``` 说明: - 该代码使用了一个简单的二次规划库来解决控制器的优化问题。需要注意的是,该库可以自定义优化目标函数和约束条件,因此可以适应不同的控制器问题。 - 该代码中的车辆模型采用了简化的 Ackermann 模型,即车辆的转向角度和前轮转角呈线性关系。在实际应用中,可能需要更加精确的车辆模型来进行控制器设计。 - 该代码中的目标轨迹为一个简单的圆形,可以根据实际需求来进行修改。 - 该代码使用了 Euler 积分法来进行状态更新,可以根据实际需求来进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值