MySQLの戻り値は配列のみですか?
ORMは使用しません.
この間、
だから私は道具を使う道具を勉強していると思います.
この機会にORMを使わないことにしました!
問題
ほとんどのORMは、パターンを定義する際に、
ただし、
どうしてこんな結果になったのでしょうか.
答えは思ったより簡単です.
リポジトリの表示時
戻り値は
すなわち,
どうすればいいの?
残念なことに、1つのオブジェクト(例えば
ライブラリが提供する関数
ちょうど
ORMを使っていないので生照会だけを使っているので、ますますSQLを使いこなすようになり、いいけど、やはり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が引き継いだことがわかりますが、mysql2
はSELECT
タイプです.戻り値は
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の快適さが恋しくて、これからは帰るでしょう.
自分の怠惰を反省し、自分がプロジェクトで出会った問題を整理しない~
Reference
この問題について(MySQLの戻り値は配列のみですか?), 我々は、より多くの情報をここで見つけました https://velog.io/@ehgks0000/MySQL-반환값은-배열로만テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol