高瀬博道の技術ブログ

高瀬博道の技術ブログです。

TypeORMに入門する - 1

概要

次何書こうかな〜とか思ったり、連載形式やめようかな〜とか思ったりしましたが、結局連載形式にしちゃいました。

今回はTypeORMにちゃんと入門しようと思います。

公式

typeorm.io

TypeORMについて

TypeORMは、NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、NativeScript、Expo、およびElectronプラットフォームで実行できるORMです。

TypeScript、およびJavaScript (ES5/6/7/8) で使用できます。

TypeORMは、アクティブレコードパターンと、データパッマーパターンの両方をサポートします。

高品質で、疎結合で、スケーラブルで保守可能なアプリケーションを最も生産的な方法で作成できます。

(TypeORMは、Hibernate、Doctrine、Entity FrameworkなどのORMに影響を受けているらしい)

クイックスタート

TypeORMを始めてみましょう。

以下でクイックスタートできます。

$ npx typeorm init --name MyProject --database mysql

コマンドを実行すると、以下のファイルが作成されています。

src/
    entity/
        User.ts
    migration/
    data-source.ts
    index.ts
.gitignore
package-lock.json
package.json
README.md
tsconfig.json

mysqlコンテナを作成するため、docker-compose.ymlを作成します。

docker-compose.yml
version: '3.9'

services:
  mysql:
    image: mysql:latest
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test

コンテナを起動します。

$ docker-compose up -d

データベース接続構成オプションは、以下にあります。

src/data-source.ts
import "reflect-metadata";
import { DataSource } from "typeorm";
import { User } from "./entity/User";

export const AppDataSource = new DataSource({
  type: "mysql",
  host: "localhost",
  port: 3306,
  username: "test",
  password: "test",
  database: "test",
  synchronize: true,
  logging: false,
  entities: [User],
  migrations: [],
  subscribers: [],
});

以下のコマンドを実行してアプリケーションを実行できます。

$ npm start

(以下エラーが出て接続できませんでした。)

sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',

ライブラリを変更するといい模様。

$ npm uninstall mysql
$ npm install mysql2

実行結果

$ npm start          

> MyProject@0.0.1 start
> ts-node src/index.ts

query: SELECT VERSION() AS `version`
query: START TRANSACTION
query: SELECT DATABASE() AS `db_name`
query: SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = 'test' AND `TABLE_NAME` = 'user'
query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'test' AND `TABLE_NAME` = 'typeorm_metadata'
query: CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT, `firstName` varchar(255) NOT NULL, `lastName` varchar(255) NOT NULL, `age` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB
query: COMMIT
Inserting a new user into the database...
query: START TRANSACTION
query: INSERT INTO `user`(`id`, `firstName`, `lastName`, `age`) VALUES (DEFAULT, ?, ?, ?) -- PARAMETERS: ["Timber","Saw",25]
query: COMMIT
Saved a new user with id: 1
Loading users from the database...
query: SELECT `User`.`id` AS `User_id`, `User`.`firstName` AS `User_firstName`, `User`.`lastName` AS `User_lastName`, `User`.`age` AS `User_age` FROM `user` `User`
Loaded users:  [ User { id: 1, firstName: 'Timber', lastName: 'Saw', age: 25 } ]
Here you can setup and run express / fastify / any other framework.

express、fastify、または他のフレームワークのセットアップもできると書いてあります。

まとめ

ここまでで、

  • TypeORMについて
  • クイックスタート

を学びました。

次回もクイックスタートを掘り下げます。

コード

今回のコードは、以下に格納しました。

github.com

takasehiromichiex.com