MySQLの戻り値は配列のみですか?


ORMは使用しません.
この間、mongooseまたはTypeORMと同じORMを用いて複数の項目が行われた.
だから私は道具を使う道具を勉強していると思います.
この機会にORMを使わないことにしました!mysql2ドライバをMySQL 8バージョンとして使用しています.
問題
ほとんどのORMは、パターンを定義する際に、findOneまたはfindのような関数を提供する.
ただし、findByIdのクエリを使用して上記の関数の戻り値を取得するとしたらどうなりますか?
SELECT * FROM users WHERE id = 1; // 1
또는
SELECT * FROM posts WHERE user_id = 1; // 2
1番の場合、mysql2のuserオブジェクトが返されると思います.user.id === 1
{
	"id": 1,
    "email": "[email protected]",
}
しかし残念なことに、結果は並んでいました.예상 결과
[
  {
	"id": 1,
    "email": "[email protected]",
  }
]
실제 결과を入れても結果は並んでいます~
どうしてこんな結果になったのでしょうか.
答えは思ったより簡単です.LIMIT 1ライブラリはアレイのみを提供するためです.
リポジトリの表示時

// 오버로딩하는 함수 4개 중, 내가 사용하는 하나이다.
query<T extends RowDataPacket[][] | RowDataPacket[] | OkPacket | OkPacket[] | ResultSetHeader>(
    sql: string,
    values: any | any[] | { [param: string]: any }
  ): Promise<[T, FieldPacket[]]>;
ジェニーン・リックTが引き継いだことがわかりますが、mysql2SELECTタイプです.
戻り値はRowDataPacketまたはRowDataPacket[][]であることがわかります.
すなわち,RowDataPacket[]で1つの値を見つけても配列に戻る.
どうすればいいの?
残念なことに、1つのオブジェクト(例えばSELECT)のみを返す機能を実現するために、
// 반환값의 두 번째 인자는 FieldPacket으로 나에겐 필요 없기 때문에 무시한다.
findUser(id: number) {
	const [rows, _] = mysql.query(`SELECT * FROM users WHERE id = ?`, [id]) ;

	return rows[0];
}
  • findOne関数を個別に実装して、上記のように値を抽出できます.

  • ライブラリが提供する関数findOneのみが使用できます.
  • ちょうど
    ORMを使っていないので生照会だけを使っているので、ますますSQLを使いこなすようになり、いいけど、やはりORMの快適さが恋しくて、これからは帰るでしょう.
    自分の怠惰を反省し、自分がプロジェクトで出会った問題を整理しない~