Sử dụng QueryBuilder của TypeORM trong NestJS - Blog LogRocket (2023)

NestJSlà một khung web JavaScript tương đối mới cho phép bạn xây dựng các ứng dụng phía máy chủ, cấp doanh nghiệp. Nó mạnh mẽ, thực thi các phương pháp hay nhất và sử dụng các tính năng JavaScript mới nhất. Nó cũng có hỗ trợ mặc định cho TypeScript và sử dụngLoạiORM, một thư viện quản lý quan hệ đối tượng mạnh được xây dựng bằng TypeScript.

Với hơn29,3k sao trên GitHub, TypeORM là một trong những ORM Node.js phổ biến nhất. Bên cạnh việc không tin vào cơ sở dữ liệu, TypeORM còn có một API duy nhất cho phép bạn truy cập dữ liệu trong cơ sở dữ liệu SQL, chẳng hạn như MYSQL và PostgreSQL và cơ sở dữ liệu NoSQL, như MongoDB, theo nhiều cách khác nhau bằng cách sử dụng các mẫu Bản ghi hoạt động và Trình ánh xạ dữ liệu.

Trong phần này, chúng ta sẽ tìm hiểu cách tích hợp TypeORM với NestJS, thêm trình điều khiển cơ sở dữ liệu và chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS.

Để làm theo hiệu quả cùng với bài viết này, bạn nên có:

  • Node.jsv12 LTS hoặc Node >v14 được cài đặt trên máy tính của bạn —NVMgiúp chuyển đổi giữa các phiên bản khác nhau của Node.js dễ dàng hơn nhiều
  • Kiến thức làm việc cơ bản về NestJS và JavaScript

Cần phải chải lên trên một số vấn đề cơ bản? Kiểm tra bài viết thực tế này trênxây dựng ứng dụng thương mại điện tử với NestJS.

Bắt đầu nào!

Mục lục

  • Thiết lập NestJS
    • Tạo thiết lập ứng dụng cơ bản
    • Định cấu hình TypeORM với SQLite
    • Tạo các thực thể cơ sở dữ liệu
  • Chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS
  • Sử dụng THAM GIA trong Truy vấn TypeORM với NestJS
    • Sử dụng tùy chọn tìm
    • Sử dụng QueryBuilder để THAM GIA

Việc thiết lập NestJS rất đơn giản và có một số cách để thực hiện, tùy thuộc vào nhu cầu của bạn. Tuy nhiên, trong bài viết này, chúng tôi sẽ cài đặt nó với CLI.

npx @nestjs/[email được bảo vệ]ứng dụng tổ mới

Lệnh này sẽ tạo khung cho NestJS “Xin chào, Thế giới!” ứng dụng soạn sẵn, vì vậy bạn có thể tham gia ngay và bắt đầu viết mã.

Bây giờ chúng tôi đã cài đặt NestJS, hãy tích hợp TypeORM vào ứng dụng của chúng tôi. Hãy chú ý đến phần này; bạn sẽ cần tích hợp TypeORM đúng cách trước khi có thể bắt đầu viết các truy vấn của mình.

Chạy lệnh này trên thiết bị đầu cuối của bạn để cài đặt trình điều khiển TypeORM và SQLite3 — chúng tôi sẽ sử dụng SQLite trong hướng dẫn này để giảm bớt sự phức tạp của việc cài đặt và thiết lập cơ sở dữ liệu MySQL hoặc PostgreSQL.

cài đặt npm @nestjs/typeorm sqlite3

Tạo thiết lập ứng dụng cơ bản

Tiếp theo, hãy tạo các bộ điều khiển và dịch vụ cho bộ khung của ứng dụng truy vấn của chúng ta bằng NestJS CLI. Chạy lệnh sau để tạo nó và chọn lớp vận chuyển API REST.

npx @nestjs/[email được bảo vệ]bài đăng tài nguyên g

Sử dụng QueryBuilder của TypeORM trong NestJS - Blog LogRocket (1)

Nó sẽ hỏi bạn có muốn tạo điểm vào CRUD hay không. Lựa chọnĐúng. Sẽ mất một chút thời gian để tạo mọi thứ cho bạn, nhưng đó là một trong những khía cạnh hữu ích của NestJS.

Cấu trúc thư mục của bạn bây giờ sẽ trông như thế này:

.├── README.md├── dist├── Nest-cli.json├── package-lock.json├── package.json├── src│ ├── app.controller.spec.ts│ ├ ── app.controller.ts│ ├── app.module.ts│ ├── app.service.ts│ ├── main.ts│ └── posts│ ├── dto│ │ ├── tạo bài đăng .dto.ts│ │ └── update-post.dto.ts│ ├── entity│ │ └── post.entity.ts│ ├── posts.controller.spec.ts│ ├── posts.controller. ts│ ├── posts.module.ts│ ├── posts.service.spec.ts│ └── posts.service.ts├── test├── tsconfig.build.json├── tsconfig.json└─ ─ sợi.lock

Định cấu hình TypeORM với SQLite

Bây giờ, hãy định cấu hình TypeORM trongsrc/app.module.tstài liệu.

Ban đầu, nó sẽ trông như thế này:

// src/app.module.tsimport { Module } từ '@nestjs/common';nhập { AppController } từ './app.controller';nhập { AppService } từ './app.service';nhập { PostModule } từ './posts/posts.module';@Module({ nhập: [PostsModule], bộ điều khiển: [AppController], nhà cung cấp: [AppService],})xuất lớp AppModule {}

Nhập các tùy chọn kết nối SQLite, mô-đun TypeORM và thực thể bài đăng, như được hiển thị trong mã bên dưới:

// src/app.module.tsimport { Module } từ '@nestjs/common';nhập { TypeOrmModule } từ '@nestjs/typeorm';nhập { SqliteConnectionOptions } từ 'typeorm/driver/sqlite/SqliteConnectionOptions';nhập { AppController } từ './app.controller';nhập { AppService } từ './app.service';nhập { Bài đăng } từ './posts/entities/post.entity';nhập { PostModule } từ './posts/ posts.module';const config: SqliteConnectionOptions = { loại: "sqlite", cơ sở dữ liệu: "../db", các thực thể: [Bài đăng], đồng bộ hóa: true}@Module({ nhập khẩu: [PostsModule, TypeOrmModule.forRoot(config )], bộ điều khiển: [AppController], nhà cung cấp: [AppService],})xuất lớp AppModule {}

Bây giờ, hãy làm việc thông qua bản cập nhật mà chúng tôi vừa thêm. Đầu tiên, nhìn vào hình dạng của đối tượng cấu hình, chúng tôi đã thêm cơ sở dữ liệu và các thực thể và đồng bộ hóa cơ sở dữ liệu. Tuy nhiên, điều quan trọng cần nhớ là đồng bộ hóa cơ sở dữ liệu không phải là điều bạn nên làm trong môi trường sản xuất, vì nó có thể dẫn đến mất dữ liệu.

Hơn 200 nghìn nhà phát triển sử dụng LogRocket để tạo trải nghiệm kỹ thuật số tốt hơnTìm hiểu thêm →
// cấu hình configconst: SqliteConnectionOptions = { type: "sqlite", cơ sở dữ liệu: "../db", các thực thể: [Post], đồng bộ hóa: true // được đặt thành false khi sản xuất }

Bởi vì chúng tôi đang sử dụng cơ sở dữ liệu SQLite, chúng tôi có thể nhanh chóng thêm đường dẫn đến cơ sở dữ liệu bằng"../db",. Nếu nó không tồn tại, nó sẽ tự động được tạo cho bạn. Đối với MySQL hoặc PostgreSQL, các hình dạng khác nhau, vì vậy hãy xemtài liệuđể tìm hiểu thêm.

Tạo các thực thể cơ sở dữ liệu

Các thực thể là các mô hình cơ sở dữ liệu và, trong trường hợp của chúng tôi,Bưu kiệnthực thể có ID và tiêu đề, như được hiển thị trong mã bên dưới:

// src/post/entities/post.entity.tsimport { Column, Entity, PrimaryGeneratedColumn } from "typeorm";@Entity()export class Post { @PrimaryGeneratedColumn() id: number; @Column() tiêu đề: chuỗi;}

Cuối cùng, trên thiết lập TypeORM của ứng dụng chung, hãy kết nối cấu hình TypeORM với NestJS. Lưu ý.forRootvì bạn có thể thấy điều gì đó tương tự khi thiết lập cấu hình cấp tính năng.

nhập: [PostsModule, TypeOrmModule.forRoot(config)],

Ở đây, chúng tôi đã kết nối TypeORM với NestJS. Tiếp theo, hãy tích hợp của chúng tôiBưu kiệntính năng với ORM.

Điều hướng đếnsrc/posts/posts.module.tsvà cập nhật nó với cấu hình sau:

// src/posts/posts.module.tsimport { Module } từ '@nestjs/common';nhập { PostService } từ './posts.service';nhập { PostController } từ './posts.controller';@Module ({ bộ điều khiển: [PostController], nhà cung cấp: [PostsService]})xuất lớp PostModule {}

Tiếp theo, nhập TypeORM,Bưu kiệnthực thể và cập nhật mã bằng cách đặt giá trị của mô-đun nhập với[TypeOrmModule.forFeature([Bài đăng])]. Xin lưu ý rằng chúng tôi đang sử dụngchoTính năngvà chuyển vào một mảng các thực thể trái ngược với cấu hình mô-đun cấp ứng dụng.

nhập { Module } từ '@nestjs/common'; nhập { PostService } từ './posts.service'; nhập { PostController } từ './posts.controller'; nhập { TypeOrmModule } từ '@nestjs/typeorm'; nhập { Đăng } từ './entities/post.entity';@Module({ nhập: [TypeOrmModule.forFeature([Post])], bộ điều khiển: [PostController], nhà cung cấp: [PostsService]})xuất lớp PostModule {}

Chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS

Có một số cách để truy cập cơ sở dữ liệu bằng TypeORM và NestJS, bao gồm sử dụng API Kho lưu trữ, API Trình quản lý thực thể và bằng cách sử dụng API DataSource.

Dưới đây là một ví dụ nhanh về cách lấy một mục theo ID bằng cách sử dụng các API được đề cập ở trên. Tôi đã xóa hầu hết các mã không liên quan đến ví dụ này, nhưng bạn có thể tìm thấy mã hoàn chỉnh trênGitHub.

//src/posts/posts.service.ts@Injectable() xuất lớp PostService { constructor( @InjectRepository(Post) private postRepository: Repository, @InjectEntityManager() private postManager: EntityManager, @InjectDataSource() private dataSource: DataSource ) { } async findOne(id: number) { const postWithRepository = đang chờ this.postRepository.findOneBy({ id }); const postWithRepositoryQueryBuilder = đang chờ this.postRepository .createQueryBuilder("post") .where("post.id= :postId", { postId: id }) .getOne() const postWithEntityManager = đang chờ this.postManager .createQueryBuilder(Post, "post "). ) .where("post.id= :postId", { postId: id }) .getOne() trả về { postWithRepository, postWithRepositoryQueryBuilder, postWithEntityManager, postWithDataSource }; }}

Như bạn có thể thấy, chúng tôi đã khởi tạo các lớp truy cập dữ liệu trong hàm tạo và sau đó sử dụng chúng bên trong các phương thức.

//src/posts/posts.service.ts...constructor( @InjectRepository(Post) private postRepository: Repository, ) { }...

Ngoài ra, phần còn lại của mã chỉ là các truy vấn TypeORM cố định; bạn có thể khám phá sâu hơn về TypeORM bằng cách xemtài liệu.

Tất cả các truy vấn trong đoạn mã trên sẽ trả về cùng một kết quả. Vì vậy, có một số cách để đạt được một mục tiêu, nhưng phương pháp nào là hiệu quả nhất?

Khi làm việc với các tập dữ liệu nhỏ, hai phương thức hoạt động tương tự nhau. Tuy nhiên, tôi nhận thấy rằng API QueryBuilder hiệu quả hơn các truy vấn kho lưu trữ khi làm việc với các bộ dữ liệu lớn hơn có nhiều mối quan hệ. Tôi tin rằng điều này là doAPI trình tạo truy vấntương đối gần với các truy vấn SQL thô hơn so vớiAPI kho lưu trữ.

sử dụngTHAM GIAtruy vấn trong TypeORM với NestJS

Nếu bạn đã viết một Truy vấn SQL liên quan đến việc truy cập dữ liệu từ nhiều bảng bằng SQL, thì rất có thể bạn đã viết mộtTHAM GIAtruy vấn trước.THAM GIAtruy vấn cho phép bạn truy vấn dữ liệu từ nhiều bảng cùng một lúc. Hãy nhìn vào mộtCHỖ NỐI BÊN TRÁIhoạt động trong TypeORM. Loại truy vấn này sẽ trả về tất cả các hàng từ bảng bên trái và các hàng phù hợp từ bảng bên phải.

Nhiều bài viết tuyệt vời từ LogRocket:

  • Đừng bỏ lỡ giây phút nào vớiphát lại, một bản tin tuyển chọn từ LogRocket
  • Học hỏicách Galileo của LogRocket loại bỏ tiếng ồn để chủ động giải quyết các sự cố trong ứng dụng của bạn
  • Sử dụng useEffect của Reactđể tối ưu hóa hiệu suất ứng dụng của bạn
  • Chuyển đổi giữanhiều phiên bản của nút
  • Khám phá cách tạo hoạt ảnhứng dụng React của bạn với AnimXYZ
  • Khám phá Kim Ngưu, một khuôn khổ mới để xây dựng nhị phân
  • Ban cố vấn không chỉ dành cho giám đốc điều hành.Tham gia Ban cố vấn nội dung của LogRocket.Bạn sẽ giúp thông báo loại nội dung chúng tôi tạo và có quyền truy cập vào các cuộc gặp gỡ độc quyền, sự công nhận của xã hội và trò chơi điện tử.

Có một số cách để thực hiện mộtCHỖ NỐI BÊN TRÁIhoạt động trong TypeORM. Hãy xem xét một số trong số họ:

Mặc dù trọng tâm của chúng tôi là sử dụng QueryBuilder, nhưng tôi sẽ chỉ cho bạn một ví dụ sử dụng cả hai tùy chọn để bạn có thể thấy sự khác biệt giữa hai tùy chọn.

Hãy xem SQL nàyCHỖ NỐI BÊN TRÁIhoạt động dưới đây. Chúng tôi sẽ chuyển đổi nó để sử dụngtìm thấytùy chọn và phương thức QueryBuilder của TypeORM.

CHỌN * TỪ "người dùng"TRÁI THAM GIA "khóa học" "khóa học" BẬT "khóa học".."id" = "người dùng".."courseId"WHERE "khóa học".."name" = 'Nguyên tắc cơ bản về JavaScript' VÀ "khóa học".."length " = '8 giờ'

sử dụngtìm thấytrong TypeORM

userRepository.find({ quan hệ: { khóa học: đúng }, trong đó: { khóa học: { tên: "Nguyên tắc cơ bản về JavaScript", độ dài: "8 giờ" }, },})

Đoạn mã trên là mộtCHỖ NỐI BÊN TRÁItruy vấn bằng TypeORMtìm thấylựa chọn. May mắn thay, nó đơn giản vì TypeORM tìm ra cách tốt nhấtTHAM GIAcho bạn và cung cấp cho bạn kết quả phù hợp. Bây giờ, hãy thực hiện truy vấn trên với TypeORM QueryBuilder.

Sử dụng QueryBuilder choTHAM GIA

const user = this.userManager .createQueryBuilder(User, "user") .leftJoin("course".."id", "course") .where("course.name = :name", { name: "JavaScript Fundamental" } ) .andWhere("course.length = :length", { length: "8hours" })

Khi sử dụng QueryBuilder, bạn cũng có các tùy chọn cho các loạiTHAM GIA, không giống nhưtìm thấytùy chọn, thực hiện mọi thứ dưới mui xe.

Đây là một sốthêm vàoTHAM GIAcó sẵn trong TypeORM.

Phần kết luận

Nếu bạn đang muốn xây dựng một chương trình phụ trợ vững chắc một cách nhanh chóng mà không ảnh hưởng đến chất lượng, hãy cân nhắc sử dụng TypeORM. Trong bài viết này, chúng ta đã tìm hiểu cách tích hợp và sử dụng TypeORM QueryBuilder với NestJS, nhưng chúng ta mới chỉ sơ lược về những gì bạn có thể làm với TypeORM. Kiểm tra tài liệu TypeORM đểtìm hiểu thêm.

Chúc mừng hack!

  1. Thăm nomhttps://logrocket.com/signup/để lấy ID ứng dụng.
  2. Cài đặt LogRocket qua NPM hoặc thẻ script.LogRocket.init()phải được gọi là phía máy khách, không phải phía máy chủ.
    • NPM
    • Thẻ tập lệnh
    $ npm Tôi --cứu đăng nhập tên lửa 

    //Mã số:

    nhập khẩu Nhật KýTên Lửa từ 'tên lửa';
    Nhật KýTên Lửa.trong đó('ứng dụng/id');

    Thêm vàovào HTML của bạn:

    <kịch bản src="https://cdn.lr-ingest.com/LogRocket.min.js"></kịch bản>
    <kịch bản>cửa sổ.Nhật KýTên Lửa && cửa sổ.Nhật KýTên Lửa.trong đó('ứng dụng/nhận dạng');kịch bản>

  3. (Tùy chọn) Cài đặt plugin để tích hợp sâu hơn với ngăn xếp của bạn:
    • Redux phần mềm trung gian
    • phần mềm trung gian ngrx
    • plugin Vuex

Bắt đầu ngay bây giờ

References

Top Articles
Latest Posts
Article information

Author: Melvina Ondricka

Last Updated: 08/09/2023

Views: 5881

Rating: 4.8 / 5 (48 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Melvina Ondricka

Birthday: 2000-12-23

Address: Suite 382 139 Shaniqua Locks, Paulaborough, UT 90498

Phone: +636383657021

Job: Dynamic Government Specialist

Hobby: Kite flying, Watching movies, Knitting, Model building, Reading, Wood carving, Paintball

Introduction: My name is Melvina Ondricka, I am a helpful, fancy, friendly, innocent, outstanding, courageous, thoughtful person who loves writing and wants to share my knowledge and understanding with you.