TypeORMでMySQLを使う
必要となるパッケージ
express
typescript
typeorm
reflect-metadata -> typeormで@Columnなどデコレータを使う為に使う
mysql -> MySQLのドライバ(MySQL自体は開発環境ではbrewなどを使ってlocalにインストールする)
code:zash
yarn add express typeorm reflect-metadata mysql
yarn add -D @types/express @types/node
MySQLにdatabaseを作る
code:zash
// mysqlサーバを起動
$ brew services start mysql
// mysqlのcliを起動
$ mysql -u root
code:mysql-cli
CREATE DATABASE {database_name};
CREATE USER '{username}'@'localhost' IDENTIFIED WITH mysql_native_password BY '{password}';
// 権限付与
GRANT ALL ON {database_name}.* TO {username}@localhost WITH GRANT OPTION;
// 反映させる
FLUSH PRIVILEGES;
/*
権限付与
GRANT ALL PRIVILEGES ON DB名.テーブル TO 'ユーザ名'@'ホスト名';
GRANT SELECT,UPDATE,INSERT,DELETE ON DB名.テーブル TO 'ユーザ名'@'ホスト名';
user削除
drop user {username}@localhost;
*/
tsconfigを編集
code:tsconfig.json
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
ormconfigの設定を書く
js/json/yma/xmlのいずれかの形式でアプリケーションのルートに作成する
createConnection()を実行する
本来はハードコートせずにそれぞれ環境変数から呼び出す
デプロイ先とローカル開発環境でそれぞれの値が異なるから
githubに上げる際のセキュリティの観点から
code:ormconfig.js
const dotenv = require("dotenv"); // 環境変数を使う
dotenv.config();
module.exports = {
synchronize: false,
type: "mysql",
host: 'localhost',
port: 3306,
username: "username",
password: "password",
database: "database_name",
logging: false,
cli: {
entitiesDir: "src/entities",
migrationsDir: "src/migration",
},
};
ormconfig.jsonを使わない場合
関数を作ってapp.tsで実行する
code:src/config/typeorm.ts
import { createConnection } from "typeorm";
import { NoteEntity } from "../entities/note";
export const connectDatabase = async () => {
await createConnection({
synchronize: true,
type: "mysql",
host: "localhost",
port: 3306,
username: "username",
password: "password",
database: "database_name",
logging: true,
});
};
Entityを定義する
code:src/entities/bote.ts
import { Column, Entity, PrimaryColumn } from "typeorm";
@Entity({ name: "notes" })
export class NoteEntity {
@PrimaryColumn({ type: "uuid" })
public id!: string;
@Column({ type: "varchar" })
public title!: string;
}
DBから値を取得する方法
code:getTitles.ts
import { getRepository } from 'typeorm';
import { NoteEntity } from '~/src/entities/note';
const getTitles = async () => {
const noteRepo = getRepository(NoteEntry);
const titles = await noteRepo.find();
return title;
}