🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

692閲覧

データベースからの情報の取り出し方を教えて欲しいです。

cheetoi

総合スコア10

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2021/01/28 03:00

編集2021/01/28 03:06

・やりたい事
usersテーブルとfollowingテーブルを操作して、ユーザーのfollowed_id(そのユーザーをフォローしている単体のユーザー)を取り出す中間テーブルを作りたいです。

ユーザーをフォローしている全体のユーザーは取得できました。

app.get('/api/v1/users/:id/following', (req, res) => { const db = new sqlite3.Database(dbPath) const id = req.params.id db.all(`SELECT * FROM following LEFT JOIN users ON following.followed_id = users.id WHERE following_id = ${id};`, (err, rows) => { if (!rows) { res.status(404).send({"error": "not found!"}) } else { res.status(200).json(rows); } }) db.close(); })

次にapp.getで:idをフォローしている:id_2のusersテーブルを:idのfollowingテーブルに結合したいのですが
それを実現するコードが分からないです。
クエリ中にid_2をどのように書けばいいかご教授ください。
またそもそもid_2以外の方法を使うべきかコメントいただけると幸いです。

app.get('/api/v1/users/:id/following/:id_2', (req, res) => { const db = new sqlite3.Database(dbPath) const id = req.params.id const id_2 = req.params.id_2 db.get(`SELECT * FROM following LEFT JOIN users ON following.followed_id = $ WHERE following_id = ${id};`, (err, rows) => { if (!rows) { res.status(404).send({"error": "not found!"}) } else { res.status(200).json(rows) } }) db.close(); })
・usersテーブル INSERT INTO users (name, age) VALUES ("haruka", 23); INSERT INTO users (name, age) VALUES ("nagai", 45); INSERT INTO users (name, age) VALUES ("masaru", 37); INSERT INTO users (name, age) VALUES ("kawai", 60); INSERT INTO users (name, age) VALUES ("yamato", 26); ); 1|haruka|23|2021-01-20 10:52:03|2021-01-20 10:52:03|2021-01-25 2|nagai|45|2021-01-20 10:52:03|2021-01-20 10:52:03| 3|masaru|37|2021-01-20 10:52:03|2021-01-20 10:52:03| 4|kawai|60|2021-01-20 10:52:03|2021-01-20 10:52:03|1996-08-23 5|yamato|26|2021-01-20 10:52:05|2021-01-20 10:52:05|
・followingテーブル sqlite> INSERT INTO following (following_id, followed_id) values (1,2); sqlite> INSERT INTO following (following_id, followed_id) values (1,3); sqlite> INSERT INTO following (following_id, followed_id) values (1,4); sqlite> INSERT INTO following (following_id, followed_id) values (2,1); sqlite> INSERT INTO following (following_id, followed_id) values (2,3); sqlite> INSERT INTO following (following_id, followed_id) values (3,4); sqlite> INSERT INTO following (following_id, followed_id) values (4,3); 1|1|2|2021-01-25 16:43:06|2021-01-25 16:43:06 2|1|3|2021-01-25 16:43:06|2021-01-25 16:43:06 3|1|4|2021-01-25 16:43:06|2021-01-25 16:43:06 4|2|1|2021-01-25 16:43:06|2021-01-25 16:43:06 5|2|3|2021-01-25 16:43:06|2021-01-25 16:43:06 6|3|4|2021-01-25 16:43:06|2021-01-25 16:43:06 7|4|3|2021-01-25 16:43:09|2021-01-25 16:43:09 id=1はid=2, 3, 4にフォローされている形です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ライブラリ名がわかりませんので、
「そんなの知らねえよ開発者に直接聞きに行けよ」としか言えません。

「開発者に直接聞きに行けよ」は合言葉です。

例えばエンジニアがOSSを作って貢献したいと考えたとします。
そして何かしらのライブラリを作って、全世界に公開したとしましょう。
でも、何も使い方が書いてないコード片なんて誰も扱えないゴミです。

作った本人も3ヶ月程すれば忘れて使えなくなるでしょうから、
この世の誰にも扱えないゴミなコード片でしかありません。
なので開発者はドキュメントという形で必死に使い方を記述します。

利用者はこのドキュメントを読みながらコード片から便利な部分を引き出す理解を行うのです。

一般的にプロとして活躍しているエンジニアは、
このドキュメントを読んで実際のコードに落とすという能力に非常に優れています。
それを見習って「開発者に聞く」を実践してみましょう。


それを踏まえて、実際に調査してみます。
ライブラリ名がわかりませんが、
恐らくnpmのmysql3ではないかと推測されます。

という訳でmysql3だったと決め打ちして調査してみましょう。
※違うなら下記の調査結果は完全に徒労です
まず質問者さんが本来のライブラリで一度調べる努力をしてみてください

ページ内に「See the API documentation in the wiki.」というリンクがあります。
意訳すると「Wiki作ってドキュメント残しているのでそちらを見てね!」と書かれています。

ですが、クエリの書き方はちゃんと載ってませんね。
手当たり次第に「API documentation」のリンクへ遷移して流し読み……
見つけました。

Database#run(sql, [param, ...], [callback])

js

1// Directly in the function arguments. 2db.run("UPDATE tbl SET name = ? WHERE id = ?", "bar", 2);

// As an array.
db.run("UPDATE tbl SET name = ? WHERE id = ?", [ "bar", 2 ]);

// As an object with named parameters.
db.run("UPDATE tbl SET name = $name WHERE id = $id", {
$id: 2,
$name: "bar"
});

基本的には$nameを使ってオブジェクトで流し込むか、
?を複数書いて配列で流し込むかの二択でしょうね。

質問文でやっているテンプレートリテラルを利用した
ID値の埋め込みはSQLインジェクション脆弱性に該当するので
キーワードを利用した値の流し込みで動的なSQL文を生成するようにしましょう。

投稿2021/01/28 06:25

miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cheetoi

2021/02/08 03:40

miyabi-sun回答ありがとうございます! 返信が遅れてしまい大変失礼しました、$nameを使って問題なく解決できました。 また質問情報が欠けていたにもかかわらず回答していただき非常に助かりました! 質問の精度を上げていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問