序文:
C C会社のバックエンドはnode.jsを使用し、フレームワークはmidwayjsを使用します。インターネット上には比較的情報が少ないため、ここにwaveを記録します。
書類:
1.公式文書:概要 | ミッドウェイ
2. コントローラのパラメータがパラメータを受信するために渡されます:ルーティングとコントローラ | ミッドウェイ
1.プロジェクトの作成
まず空のフォルダーを作成し、そのフォルダー内で cmd コマンドを実行します。
npm init midway@latest -y
Enter キーを押し続けると、次の項目が表示されます。
2.プロジェクトのステータス:
ポート番号とグローバル ルーティング プレフィックスを構成します。
次に、npm run dev を実行してプロジェクトを実行します
3.连接数据库(MikroORM)
1. ここでは、MikroORM を使用してデータベースに接続します
まずターミナルで次のコマンドを実行して、MikroORM と mysql の依存関係をダウンロードします。npm i -s @mikro-orm/core @mikro-orm/mysql npm i @midwayjs/mikro@3 @mikro-orm/core --save
実行後、package.json ファイル内の依存関係の値には、次の 2 つの追加値が含まれます。
次に、configuration.ts ファイルに、 MikroORM: をインポートします。
コードをインポートします:import * as mikro from '@midwayjs/mikro';
次に、mikro のデータ ソースを config.default.ts ファイルに追加します。
コード:mikro: { dataSource: { default: { dbName:'nk_product_pro', // 数据库名 type: 'mysql', host: 'localhost', // 这里是连接的ip地址 port: 3306,// 端口号 username: 'root', // 账号 password: '***', // 密码 // 配置实体模型 entities: [userNameModel], // // 或者扫描形式 // entities: [ // '**/entity/*.entity{.ts,.js}' // ] }, } }
其中的 userNameModel :
ユーザー名コントローラー:import { Inject, Controller, Get } from '@midwayjs/core'; import {userNameService} from "./userService"; @Controller('/userName') export class userNameController { @Inject() userNameService: userNameService; @Get('/userName') async userName() { console.log('进入方法'); await this.userNameService.getUserName(); return { success: true, message: 'OK', data: '进入userName方法' }; } }
userModel.ts:
import {Entity, PrimaryKey, Property} from "@mikro-orm/core"; @Entity({ tableName: 'test_user', schema: 'nk_product_pro' }) // 这里的 tableName 指定的是表名 schema: 是数据库名 export class userNameModel { @PrimaryKey() @Property() id: number; @Property() title:string; }
userService.ts:
import {Provide} from "@midwayjs/core"; import {InjectRepository} from "@midwayjs/mikro"; import {EntityRepository} from "@mikro-orm/mysql"; import {userNameModel} from "./userModel"; @Provide() export class userNameService{ @InjectRepository(userNameModel) // 这个就类似java的 mapper private readonly chatRoomRepo: EntityRepository<userNameModel> async getUserName() { console.log(await this.chatRoomRepo.findAll()); console.log('获取成功'); } }
4. 一般的な mysql クエリ、挿入、削除、およびネイティブ挿入
import {Provide} from "@midwayjs/core"; import {InjectEntityManager, InjectRepository} from "@midwayjs/mikro"; import {userNameModel} from "./userModel"; import { EntityManager, EntityRepository } from '@mikro-orm/mysql'; // 需要使用数据库驱动对应的类来执行操作 // @ts-ignore @Provide() export class userNameService{ @InjectRepository(userNameModel) // 这个就类似java的 mapper private readonly chatRoomRepo: EntityRepository<userNameModel> @InjectEntityManager() em: EntityManager; async getUserName() { console.log(await this.chatRoomRepo.findAll()); // 查询 // await this.chatRoomRepo.find( // { // id: 1, 这个是查询id字段的值 等于 1 // paixu2: 1, // title: { $like: '%' }, // 模糊查询 // paixu: { $gt: 1 }, // 大于 1 // id: { $in: [1, 2] }, // 数据库的in查询 // }, // { // orderBy: { paixu: QueryOrder.desc, paixu2: QueryOrder.desc }, // 按照某个字段进行排序,例如:先对 paixu 这字段进行降序,在 paixu 这个值一致的情况下,再进行降序 // limit: 1, //获取多少条数据 // }, // ); // 插入 // const model = new userNameModel(); // // model.title = '哈哈,你好呀'; // // 单条插入 // this.chatRoomRepo.nativeInsert(model); // 修改 // this.chatRoomRepo.nativeUpdate({ // id: 1 // },{ // title:'你好呀' // }) // // 上面的修改sql会变成:update "nk_product_pro"."test_user" set "title" = '你好呀' where "id" = 1 // // 删除 // this.chatRoomRepo.nativeDelete({ // id : 1, // title: '你好呀' // }) // // 以上的删除语句:delete from "nk_product_pro"."test_user" where "id" = 1 and "title" = '你好呀' console.log(this.em) // 这个是直接使用原生sql的方式,在遇到比较复杂,或者进行连表查询的时候,推荐使用这种方式 const ctionEm = this.em.getConnection(); const ret = await ctionEm.execute("select * from nk_product_pro.test_user"); console.log(ret) } }
5. postgresqlデータベースの一括挿入、変更、テーブルクエリ
- バッチ挿入と変更
赤いものは挿入を表し、青いものは変更を表します。最初は、persist メソッドを使用して新しいデータを挿入することは知っていましたが、この変更を理解していませんでした。ただ値を変更しただけです。 for ループ。
await this.em.flush(); メソッドの実行後に、プール配列の値も変更されるのはなぜですか?テスト後、mikro フレームワークは、orm フレームワークによってクエリされたデータを自動的に変換します。このデータが await this.em.flush(); メソッドの前に実行される場合、 data 変更がある場合 (クエリされても再割り当てがない場合、または割り当てられた値が元の値と同じ場合は変更されません)、自動的に変更されます。 ID に基づいています。更新したくない場合は、値を変更する前にフラッシュ メソッドを実行させることができます
await this.em.flush(); を実行すると、トランザクションが自動的に開始されます。
- テーブル結合クエリ
import { EntityManager } from '@mikro-orm/postgresql';
EntityManager は正しくインポートする必要があります。インポートしないと、対応するメソッドが存在しません。
これはテーブルを結合する主な方法です。
createQueryBuilder(InfluencerPoolEntity, 'a') // 这个说的是,连接查询的时候,主表的是 InfluencerPoolEntity ,然后起个别名叫 a
.leftJoin('a.influencer', 'b'); 这个是左连接 a表里面的一个 influencer 属性,起一个别名叫 b
@ManyToOne(() => InfluencerEntity, { nullable: true }) influencer?: InfluencerEntity; 这两行代码是 InfluencerPoolEntity 类里面的,然后这个类里面有个 influencer 属性,也就是a.influencer 的 influencer 的这个值,可以看到 influencer 是 InfluencerEntity类型的,然后在查询的时候,orm会自动把 influencer 加多 ‘_id’ 然后 ‘on’ 会等于 InfluencerEntity 这个实体的表id 也就是以下的代码: select "a".*, "b".* from "ecross"."influencer_pool" as "a" left join "ecross"."influencer" as "b" on "a"."influencer_id" = "b"."id"
次のようにすることもできます。
対応する SQL ステートメント:
select "a".*, "b".* from "ecross"."influencer_pool" as "a" left join "ecross"."influencer" as "b" on "a"."influencer1_id" = "b"."influencer2_id" and "a"."user1_id" = "b"."user2_id"
- null データと非 null データをクエリする