質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

意見交換

クローズ

6回答

1131閲覧

ストアドプロシージャを利用した方がいいのか?

kentaronagata

総合スコア20

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2023/07/02 06:03

編集2023/07/02 06:49

0

0

テーマ、知りたいこと

クライアントから検索される時のSQLから抽出する時のやり方についてお聞きしたいです。

背景、状況

現在、webアプリをdjangoで作成していて、クライアントから検索される時の動作が以下のコードのようにpythonファイル内でsqlコーディング(6行目)しています。

python

1def all(request): 2 query_search = request.GET.get('title_button') 3 template_name="" 4 cur = connect.cursor(dictionary=True) 5 6 cur.execute(f'select * from seiti_data where title like "%{query_search}%"') 7 8 rows = cur.fetchall() 9 cur.close() 10 query_title = rows[0]['title'] 11

最近基本情報を読んでいるとsqlでストアドプロシージャという処理を軽く勉強し理解があっているかわからないのですが、sqlをデータベース側で処理し、その結果を返すようにすることでサーバの負担は減るということであっているのでしょうか?
だとすると、pythonファイルにsqlを記載して処理結果を呼び出すより、データベース側でストアドプロシージャを実行するようにコーディングしてあげた方がよろしいのでしょうか?

わかる方がいれば教えていただけると幸いです。

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

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

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

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

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

回答6

#1

maisumakun

総合スコア145192

投稿2023/07/02 06:59

編集2023/07/04 00:02

sqlをデータベース側で処理し、その結果を返すようにすることでサーバの負担は減るということであっているのでしょうか?

この場合は負荷軽減という意味は全くありません。もとから実行したいSQL文が1文しかないので、それをストアドにしたところで何も削減できる余地はありません。

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

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

#2

kentaronagata

総合スコア20

投稿2023/07/02 07:24

回答ありがとうございます。
sql文が複数あり複雑な場合にストアドプロシージャを利用すれば良いということですね。

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

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

#3

yambejp

総合スコア114883

投稿2023/07/03 02:55

編集2023/07/03 02:57

procedureを利用すればSQL側でインジェクション対策ができるので「全く意味がない」とまではいいきれません。

SQL

1create table tbl(id int primary key,val varchar(10)); 2insert into tbl values 3(1,'a'), 4(2,'aaa'), 5(3,'1a2'), 6(4,'1aaa2'), 7(5,'b'), 8(6,'ab'), 9(7,'bbb'); 10 11drop procedure if exists proc_like_val; 12delimiter // 13create procedure proc_like_val(in v varchar(10)) 14begin 15set @a=concat('%',v,'%'); 16set @sql='select * from tbl where val like ? '; 17prepare stmt from @sql; 18execute stmt using @a; 19end 20// 21delimiter ;

これに対して

SQL

1call proc_like_val('a'); 2call proc_like_val('aaa');

が有効なことは確認できるでしょう
たとえばインジェクションをねらって、SQL文を忍び込ませてもはじいてくれます
ただ、普通はプログラム側でプレースホルダ処理は行いますのでバリデーションだけを目的にprocedureを利用することは少ないかもしれません

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

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

#4

kentaronagata

総合スコア20

投稿2023/07/04 05:56

#3
ご回答ありがとうございます。

プロシージャ機能を利用するとインジェクション対策になることは知りませんでした。
私がフレームワークとして利用しているDjangoでは基本的にORMによってインジェクション対策されていると出てきたのでプロシージャを使う意味はあまりないのかもしれないですけど、勉強のために触ってみます!

ありがとうございます。

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

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

#5

odataiki

総合スコア938

投稿2023/07/06 04:43

編集2023/07/06 23:47

今回の質問の環境に関して言えば、使う必要はないと思います。


私はストアドプロシージャを好みません。
ソース管理がややこしくなっていくからです。
ソースコード内にSQLを書けばメンテナンスはコード内だけで済みます。
不具合が出た時にソース内SQLやストアドを行ったり来たりするのが煩雑で
修正プログラムをリリースするのに合わせてストアドも一緒にリリースしないといけないので
そのタイミング合わせも煩わしいと感じてます。


私がストアドを使っていたのは

  • 複雑な集計処理を出来るだけ高速化したかった
  • 言語仕様の桁数より大きい数値の計算(VBA)

でも実際にストアドを使ってみてその便利さや不便さを
体験するのも大切だと思いますよ。

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

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

#6

ockeghem

総合スコア11701

投稿2023/07/06 09:28

ストアドプロシージャの利用がSQLインジェクション対策になるか否かという話は、以前以下の記事に書きましたので、よろしければ御覧ください。

SQLインジェクション対策の極意はSQL文を組み立てないことにあり

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問