[解決済み] Sequelize:イーガーロードする方法、関連付け、生:真?
質問内容
Node.jsでのイager loadingは、Sequelizeを使用する唯一の方法です。私は、ネストされたインクルードを持つMySQL DBからすべてのユーザー調査データをエクスポートしようとしています。アンケートの回答は500k行以上あり、私のスクリプトは、返されたすべての行のインスタンスを作成するためにメモリ不足でクラッシュしています。
クエリを "raw" にして、単純なオブジェクトデータだけを取得したいのですが、そうすると、各インクルードの最初の関連レコードだけを返し、それらをすべて含む配列は返されません。すべての関連レコードを取得し、それをrawにする方法はありますか?それとも、Sequelizeは大規模なクエリのためにこの方法を使用することは想定されていないのでしょうか?以下は私のクエリです。
db.User.findAll({
include: [
{ model: db.Referrer }, // has one Referrer
{ model: db.Individual }, // has many Individuals (children)
{
model: db.UserSurvey, // has many UserSurveys
include: {
model: db.Answer, // UserSurveys have many Answers
include: {
model: db.Question // survey question definition
}
}
}
],
raw: true // only returns first Individual, UserSurvey, Answer, etc.
nest: true // unflattens but does not fix problem
})
このクエリは、返される行を制限すれば問題なく動作します。制限しない場合は、データセットの大きさによってクラッシュするだけです。トップレベルや様々なインクルード内のあらゆる場所にrawを追加してみましたが、何もうまくいかないようです。クエリを Answer に基づいて、すべてのリレーションシップが単一のレコードを必要とするようにすればよいのでしょうか?それとも、これらの複雑なクエリを raw にして、すべての関連レコードを含める方法があるのでしょうか?読んでくれてありがとう、これは私が数日間困っていたことです。
どのように解決するのですか?
Sequelizeのドキュメントにあるように
raw
オプションを使用します。
sequelize はクエリの結果をフォーマットしようとしません。 のインスタンスを作成します。
つまり、1つのメインレコードと2つの関連レコードがある場合、SequelizeがSQL-queryから取得するものなので、2つのレコードが取得されます。
あなたの場合は
limit
と
offset
オプションを循環させて、チャンク単位でレコードを取得します。そうすれば、メモリ不足になることはないだろう。
また、モデルの代わりにプレーンなオブジェクトを取得するには
get({ plain: true })
というように、各モデルに対して
const users = db.User.findAll({
include: [
{ model: db.Referrer }, // has one Referrer
{ model: db.Individual }, // has many Individuals (children)
{
model: db.UserSurvey, // has many UserSurveys
include: {
model: db.Answer, // UserSurveys have many Answers
include: {
model: db.Question // survey question definition
}
}
}
]
})
const plainUsers = users.map(x => x.get({ plain: true }))
関連
-
[解決済み】MySQLユーザーDBにパスワードカラムがない - OSXへのMySQLインストール
-
[解決済み】Fatal error: mysqldをrootで実行する方法は、マニュアルの「セキュリティ」セクションをお読みください。
-
[解決済み] MySQLのforeachループ
-
[解決済み] Error Dropping Database (Can't rmdir '.test', errno: 17)
-
[解決済み] MySql テーブル、エラー#1064 & エラー#1068 複数の主キーが定義されている [終了] 。
-
[解決済み] エラー:テーブル '<table-name>' に対するユーザー '<userid>'@'<ip-address>' への select コマンドが拒否されました。
-
[解決済み] SQL エラー - テーブルの定義が正しくありません; auto カラムは 1 つしか存在できません。
-
[解決済み] 1行目の列 'id' に不正な整数値 '' があります。
-
[解決済み] エラーコード1111。グループ関数の無効な使用
-
[解決済み] どちらが速いですか?SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】mysqlが内部または外部のコマンド、操作可能なプログラムまたはバッチとして認識されない。
-
[解決済み】MAMPのmysqlサーバーが起動しない。mysqlのプロセスが起動していない
-
[解決済み】MySQLエラー1264:カラムの範囲外の値
-
[解決済み】MySQLの「ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してみてください」を回避する方法
-
コマンドでmysqlに接続中、'mysql'が内部または外部コマンドとして認識されない エラーは解決されました。
-
[解決済み] MySQLで日付のみのパラメータを使用してタイムスタンプの日付を比較する方法は?
-
[解決済み] エラー:テーブル '<table-name>' に対するユーザー '<userid>'@'<ip-address>' への select コマンドが拒否されました。
-
[解決済み] MySQLです。テーブルを作成できません (errno: 150)
-
[解決済み] Mysql: const テーブルを読み込んだ後、不可能な場所に気づいた。
-
[解決済み] エラーコード1111。グループ関数の無効な使用