ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何在 JavaScript 项目中用 EntitySchema 定义 TypeORM 实体而不用装饰器

如何在 JavaScript 项目中用 EntitySchema 定义 TypeORM 实体而不用装饰器 如何在 JavaScript 项目中用 EntitySchema 定义 TypeORM 实体而不用装饰器【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm如果你用 JavaScript 写 Node.js 应用又不想用装饰器定义实体比如项目平台不支持 ES6 类或者你偏好纯对象描述元数据TypeORM 提供了EntitySchema方案用普通对象声明实体名、列和关系再把它注册进DataSource。完成后的效果是应用启动时自动建表save/find等 Repository 操作可以正常使用。以下内容基于官方文档 Using with JavaScript 与 Separating Entity Definition。准备条件安装依赖。TypeORM 本体加数据库驱动以 Postgres 为例npm install typeorm npm install pg按安装文档getting-started说明还需要安装reflect-metadatashim 并在应用全局位置导入一次例如app.ts中import reflect-metadatanpm install reflect-metadataJavaScript 文档中未额外列出平台限制只要求你的平台支持 ES6 类之外的纯对象写法时使用 EntitySchema如果平台支持 ES6 类省略类型注解后其余用法与 TypeScript 一致。用 EntitySchema 定义实体文件每个实体一个文件导出一个EntitySchema实例。以Category为例entities/Category.jsvar EntitySchema require(typeorm).EntitySchema module.exports new EntitySchema({ name: Category, // Will use table name category as default behaviour. tableName: categories, // Optional: Provide tableName property to override the default behaviour for table name. columns: { id: { primary: true, type: int, generated: true, }, name: { type: varchar, }, }, })要点均来自文档注释与正文name是实体名。不写tableName时表名默认取实体名的小写形式如Category对应表category显式给出tableName可覆盖默认表名。每个实体必须有主键列这里用primary: true加generated: true实现自增 id。列类型用字符串描述如int、varchar、text。Post实体加一个 many-to-many 关系entities/Post.jsvar EntitySchema require(typeorm).EntitySchema module.exports new EntitySchema({ name: Post, tableName: posts, columns: { id: { primary: true, type: int, generated: true, }, title: { type: varchar, }, text: { type: text, }, }, relations: { categories: { target: Category, type: many-to-many, joinTable: true, cascade: true, }, }, })关系中target填对方实体的nametype: many-to-many指定关系类型joinTable: true表示由 TypeORM 生成中间表cascade: true让保存 Post 时级联保存关联的 Category。注册 DataSource 并运行在入口文件中创建DataSource通过require加载实体文件并打开synchronize让表结构自动与数据库同步var typeorm require(typeorm) var dataSource new typeorm.DataSource({ type: postgres, host: localhost, port: 5432, username: test, password: admin, database: test, synchronize: true, entities: [require(./entities/Post), require(./entities/Category)], }) dataSource .initialize() .then(function () { var category1 { name: TypeScript } var category2 { name: Programming } var post { title: Control flow based type analysis, text: TypeScript 2.0 implements a control flow-based type analysis for local variables and parameters., categories: [category1, category2], } var postRepository dataSource.getRepository(Post) postRepository .save(post) .then(function (savedPost) { console.log(Post has been saved: , savedPost) console.log(Now lets load all posts: ) return postRepository.find() }) .then(function (allPosts) { console.log(All posts: , allPosts) }) }) .catch(function (error) { console.log(Error: , error) })其中连接参数host、port、username、password、database需替换为你自己的数据库配置entities数组必须列出当前连接要使用的每一个实体文档明确说明每个实体都要列入。这里getPostRepository通过实体名字符串Post获取 RepositoryJavaScript 场景下没有类引用用实体名即可。验证结果按文档给出的流程运行应用后initialize()成功表示连接建立、实体注册完成synchronize: true会在每次运行时把实体同步为数据库表save之后控制台输出Post has been saved:并带出保存后的记录文档示例输出随后find()输出All posts:及查到的全部帖子文档示例输出。这两个日志是文档示例中展示的输出形式实际值以你的数据为准如果进入.catch分支打印Error:说明连接或同步失败。可选扩展TypeScript 或更复杂的 Schema 写法如果你的项目允许 TypeScript或者需要复用列定义Separating Entity Definition 提供了同样的EntitySchema机制的更多形态类型安全给EntitySchema传泛型接口如new EntitySchemaCategory({ ... })Repository 操作即可获得类型提示type可用Number/String等构造函数写法复用基础列EntitySchema 方式不能像装饰器那样extend抽象基类文档建议用展开运算符——把id、createdAt、updatedAt等公共列定义成对象各 schema 中...BaseColumnSchemaPart展开并配合EntitySchemaColumnOptions标注类型嵌入实体用embeddeds选项挂子 schema可加prefix控制列名前缀单表继承STI父 schema 设置inheritance: { pattern: STI, column: type }子 schema 设置type: entity-child和discriminatorValue子 schema 的 columns 用...BaseSchema.options.columns展开父列。这些写法与 JavaScript 场景的 CommonJS 形式不冲突只是把module.exports换成export const。限制与注意事项文档明确EntitySchema 方式无法像装饰器那样通过类继承扩展基础列需要时改用展开运算符复用列定义未列入DataSource.options.entities的实体不会被该连接使用synchronize用于自动建表/同步表结构示例中保持开启以验证实体定义是否正确生效。【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表