FlaskでSQLクエリを直接実行する方法!SQLAlchemyの生クエリ活用法を初心者向けに解説
生徒
「Flaskでデータベースを使っているんですが、自分で書いたSQL文をそのまま実行したいんです。どうすればいいですか?」
先生
「Flaskで使われるSQLAlchemyでは、Pythonでデータベース操作ができますが、直接SQL文を書く『生クエリ(なまクエリ)』という方法も使えますよ。」
生徒
「生クエリって、どういう場面で使うんですか?」
先生
「それでは、FlaskとSQLAlchemyで生クエリを実行する方法を、わかりやすく解説していきましょう!」
1. 生クエリ(Raw SQL)とは?
生クエリとは、データベースに対して送るSQL文(Structured Query Language)を、Pythonのコードではなく自分の手で直接書いて実行する方法です。普段はSQLAlchemyがデータ操作を代わりに行ってくれますが、「自分で細かい命令を書きたい」「SQLそのものの動きを確かめたい」そんなときに役立つのが生クエリです。
まずは、もっとも基本的なSQL文を見てみましょう。
SELECT * FROM users;
これは「usersというテーブルに保存されているデータを全部見せてください」という意味の命令です。Excel の表をまるごと表示するイメージだと理解しやすいでしょう。
SQLAlchemyはとても便利で、Pythonコードだけでテーブルの作成やデータ操作ができます。しかし、以下のようなケースでは、生クエリを使うほうが簡単でわかりやすくなることがあります。
- 複雑な検索条件を使いたいとき
- データベース固有の機能を試したいとき
- 書き慣れたSQL文をそのまま実行したいとき
たとえば、「名前が『たろう』のユーザーだけ取り出したい」という単純な場面でも、生クエリなら次のように書けます。
SELECT * FROM users WHERE name = 'たろう';
このように、生クエリは“テーブルに直接話しかける”ような操作方法であり、データベースの仕組みを理解したい初心者にもとても良い学習材料になります。SQLの基本を身につけることで、Flask アプリ開発の幅もぐっと広がります。
2. なぜ生クエリを使うの?
SQLAlchemyはとても便利で、多くの操作をPythonのコードだけで完結できます。しかし、実際の開発では「もっと細かい制御がしたい」「SQLならではの書き方を活かしたい」と感じる場面が出てきます。そんなときに役に立つのが、生クエリ(Raw SQL)です。データベースに対して、あらゆる命令を自分の手で直接書けるため、操作の自由度が一気に広がります。
生クエリを使う主な理由としては、次のようなものがあります:
- もっと細かく自由に操作したい(Pythonコードでは表現しづらい条件を書ける)
- 複雑なJOINや集計が必要(SQL特有の高度な書き方を活かせる)
- 書き慣れたSQL文をそのまま実行したい(学習済みの知識をそのまま活かせる)
例えば「年齢が30より上のユーザーだけを取り出したい」という簡単な例でも、生クエリなら次のように表現できます。
SELECT * FROM users WHERE age > 30;
SQLに慣れている方なら、思ったとおりの形で命令を構築できるので、とても直感的です。また、初心者にとっても「データベースがどのように情報を取り出すのか」を理解する良い練習になります。生クエリを上手に使いこなすことで、Flask開発の幅がぐっと広がり、より柔軟なアプリを作れるようになります。
3. FlaskとSQLAlchemyの基本設定
ここからは、生クエリを実行するための準備として、FlaskとSQLAlchemyの基本設定を整えていきます。といっても難しい作業ではなく、「アプリにデータベースの場所を教える」「データベースを操作するための道具を用意する」という二つのステップだけです。初心者でも順を追って進めれば問題ありません。
今回は、学習用として扱いやすいSQLite(エスキューライト)を使用します。専用のサーバーを用意しなくてもファイル1つで動くため、初めてデータベースに触れる方にぴったりです。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# Flaskアプリの土台を作る
app = Flask(__name__)
# データベースの保存場所(example.db)をFlaskに伝える
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.db"
# 不要な警告を出さないための設定
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# SQLAlchemy(データベース操作の道具)をアプリに接続
db = SQLAlchemy(app)
上記のコードを書くだけで、Flaskアプリはデータベースとやり取りする準備が整います。たとえば、example.dbというファイルがまだ存在しなくても、後でテーブルを作成すると自動で生成されます。これがSQLiteの扱いやすいポイントです。ここまで設定できていれば、生クエリを実行するための基礎部分はクリアです。
4. テーブルを作ってみよう
ここからは、実際にデータを保存するための「テーブル」を作成していきます。テーブルとは、Excel の表のように情報を行と列で整理して保存する場所です。アプリでユーザー情報を扱いたい場合、その内容に合わせた設計図(モデル)を書き、SQLAlchemy にテーブルを作ってもらう仕組みです。
今回は、もっとも基本的な「ユーザーを管理するテーブル」を作ってみましょう。ユーザーの名前や年齢といった情報を保存するため、以下のようなモデル(設計図)を用意します。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True) # 1人ずつ識別するための番号
name = db.Column(db.String(50)) # ユーザーの名前
age = db.Column(db.Integer) # ユーザーの年齢
このコードを見ると「ただクラスを書いただけで本当に表ができるの?」と思うかもしれません。しかし、SQLAlchemy はこのモデルを読み取り、データベースに必要なテーブルを自動で準備してくれます。とても便利な仕組みです。
モデルを書いたら、次は実際にテーブルを作る作業です。Flask アプリのコンテキスト内で db.create_all() を実行すると、必要なテーブルが自動生成されます。
with app.app_context():
db.create_all() # モデルをもとにテーブルを作成
これでユーザーデータを保存するための土台が整いました。データベース初心者でも扱いやすく、どのように情報が構造化されているのか理解しやすい部分なので、ゆっくり確認してみてください。
5. 生クエリを使ってデータを取得する
ここからは実際に、生クエリを使ってテーブルに入っているデータを取り出してみましょう。SQLの動きが目に見えてわかるため、「データベースがどう情報を返してくれるのか」を理解する良い練習になります。仕組みがわかると、後の条件検索や集計にも応用しやすくなります。
from sqlalchemy import text
with app.app_context():
# users テーブルからすべての行を取得するSQLを実行
result = db.session.execute(text("SELECT * FROM user"))
for row in result:
print(row)
text() で囲んだ部分が、生クエリとして実行される SQL 文そのものです。ここでは SELECT * FROM user を使い、テーブル内の全データを取得しています。for 文で1行ずつ取り出すと、Python で扱える形になって返ってきます。
実行すると、次のように登録されているデータがターミナルに表示されます。数値や文字列の並びを見ると、SQL の戻り値がそのまま Python に渡っているイメージがつかみやすいはずです。
(1, 'たろう', 25)
(2, 'はなこ', 30)
このように、生クエリを使うと SQL の動作を直に確認でき、データベースの仕組みをより深く理解できます。初心者の方でも扱いやすく、学習ステップとして非常におすすめの方法です。
6. WHEREで条件をつけて検索する
特定の条件でデータを取り出すには、WHERE(ウェア)という命令を使います。
sql = text("SELECT * FROM user WHERE age > :age")
with app.app_context():
result = db.session.execute(sql, {"age": 20})
for row in result:
print(row)
:ageは変数のようなもので、あとから値を指定します。{"age": 20}とすることで、「20歳より上」のユーザーを探します。
(1, 'たろう', 25)
(2, 'はなこ', 30)
7. データを追加する生クエリ
SQLではデータを取り出すだけでなく、追加もできます。
sql = text("INSERT INTO user (name, age) VALUES (:name, :age)")
with app.app_context():
db.session.execute(sql, {"name": "じろう", "age": 22})
db.session.commit()
commit()(コミット)をすることで、データがデータベースに保存されます。
8. 注意点とセキュリティ
生クエリはとても便利ですが、使い方を間違えると危険なこともあります。
特に気をつけたいのはSQLインジェクションという攻撃です。悪意のある人が、データベースを壊したり、勝手にデータを取り出すことができてしまう問題です。
これを防ぐには、SQLの中に:変数を使い、値を辞書({"key": value}の形)で渡すのがポイントです。
9. 生クエリとORMの違いをおさらい
SQLAlchemyではふだんは「ORM(オーアールエム)」という便利な仕組みを使って、Pythonのコードだけでデータベースを操作します。
ORMは初心者にとってとても便利ですが、次のような場面では生クエリのほうが向いています:
- 複雑な検索をしたい
- SQLでしかできない処理をしたい
- パフォーマンス(速さ)を重視したい
生クエリとORMを使い分けることで、Flaskの開発がより柔軟になります。
まとめ
FlaskでSQLAlchemyを使いながら生クエリを実行する方法は、初心者にとって最初は少しむずかしく感じる部分もありますが、実際に手を動かしてみると、その柔軟さや便利さに気づきやすいものです。とくに、複雑な検索条件や集計、結合処理などを扱う場合には、PythonのORMだけでは書きにくい処理が出てきます。そうした場面で、生クエリを適切に使えるかどうかは、アプリケーションの設計や処理速度にも直接影響してきます。生クエリを知っておくことは、Flaskの開発経験を深める上でも大切な要素といえるでしょう。
この記事で紹介したように、SQLAlchemyではtext()を使ってSQL文をそのまま実行でき、結果もPythonのオブジェクトとして扱えます。WHEREで条件を付けたり、INSERTでデータを追加したりすることも自由自在です。さらに、パラメータを辞書として渡す方法を使えば、SQLインジェクションの対策にもつながり、安心して生クエリを書けるようになります。こうした点は、日々の開発で必ず役立つ知識のひとつです。
また、ORMと生クエリは「どちらが正しい」というものではなく、それぞれに得意・不得意があります。ORMは、基本的なCRUD操作を簡単に書けるのが魅力で、初心者でも扱いやすい構造になっています。対して、生クエリは自由度が高く、細かな調整や複雑な検索ロジックを実現する際に強さを発揮します。大切なのは、この二つを状況に応じて適切に使い分けることです。使い分けができるようになると、Flaskアプリケーションの開発効率は大きく向上し、より実践的なシステム構築ができるようになります。
実際のアプリケーションでは、ログを記録したり、分析用に専用の検索クエリを投げたりする場面も多く、SQLを自分で書けると表現力が格段に広がります。とくにJOINを含む複雑な検索処理は、生クエリを使うほうがわかりやすい場合も多く、慣れてくると「ここはSQLで書いたほうが早い」と自然に判断できるようになります。初心者のうちは、まずORMで基本的な操作に慣れ、必要な場面で生クエリに挑戦するスタイルが無理なくおすすめです。
以下に、生クエリを使ったサンプルコードをもう一度まとめておきます。コードの流れを確認しながら、自分でも実際に試してみるとさらに理解が深まるでしょう。
サンプルプログラムまとめ
from sqlalchemy import text
# すべてのユーザーを取得
with app.app_context():
result = db.session.execute(text("SELECT * FROM user"))
for row in result:
print(row)
# 条件つき取得
sql = text("SELECT * FROM user WHERE age > :age")
with app.app_context():
result = db.session.execute(sql, {"age": 20})
for row in result:
print(row)
# データ追加
sql = text("INSERT INTO user (name, age) VALUES (:name, :age)")
with app.app_context():
db.session.execute(sql, {"name": "さぶろう", "age": 28})
db.session.commit()
生クエリを使えるようになると、FlaskとSQLAlchemyの理解が一気に広がります。データベースの仕組みそのものを理解しながら進められるため、アプリケーションの内部処理を深く知るきっかけにもなるでしょう。テーブル構造を考える力も鍛えられ、より扱いやすいデータ設計を行えるようになります。データベースを扱う上で重要な「テーブルの設計力」と「SQLの表現力」は、どちらも実際の開発経験の中で確実に身についていくものです。
生徒
「先生、生クエリって最初はむずかしそうに見えましたけど、書いてみると意外と理解しやすいですね。」
先生
「そうなんですよ。SQLのルールさえ分かってしまえば、生クエリはとてもシンプルです。ORMとあわせて使えるようになると、扱えるデータ処理の幅が一気に広がります。」
生徒
「たしかに、WHEREで条件をつけたり、INSERTで追加したりするのは、SQLのほうが直感的に思えました。」
先生
「その感覚は大事ですね。開発では、ORMを使うところとSQLを書くところを自然に選べるようになると作業効率が大幅に上がりますよ。」
生徒
「もっと複雑なJOINも試してみたいです!」
先生
「ぜひ挑戦しましょう。実践しながら覚えるのがいちばん良い方法ですからね。」