MySQL | SQLite経験者向け、30日で習得するMySQL:実務応用 - Day24 アプリ連携

SQL MySQL
スポンサーリンク

Day24 前半のゴール

「“アプリからMySQLに話しかける”流れを、自分でイメージできるようになる」

ここまでで、MySQL 単体での設計・チューニングはかなり触ってきました。
Day24 からは「アプリ連携」、つまり Node.js や Python から MySQL に接続して、実際にデータを読み書きする話に入ります。

前半のゴールはこうです。

アプリからDBにつなぐときに必要な情報(ホスト・ユーザー・パスワードなど)を理解する
Node.js と Python で「接続して1件SELECTする」までの流れをイメージできる
ソースコードにパスワードを書き込まない、という最低限のセキュリティ感覚を持つ

ここでは「超シンプルな接続+SELECT」を軸に、両方の言語で見ていきます。


アプリからMySQLにつなぐときに必要な情報

「“接続先の住所”と“鍵”をちゃんと分けて考える」

まず、どの言語からつなぐにしても、必要な情報はほぼ共通です。

接続先サーバーのホスト名(またはIPアドレス)
ポート番号(デフォルトは 3306)
データベース名
ユーザー名
パスワード

これを、もう少しイメージしやすく言い換えると、

どこにある MySQL に
どのDBを使う権限を持った
どのユーザーとして
どの鍵(パスワード)で入るか

という話です。

例えば、ローカル開発環境なら、だいたいこんな感じになります。

ホスト名: localhost
ポート: 3306
データベース名: sample_app
ユーザー名: sample_user
パスワード: secret_password

この情報を、Node.js や Python の「MySQL用ライブラリ」に渡してあげることで、
アプリから MySQL に接続できるようになります。

ここで一つだけ、セキュリティ的に超重要なことを先に言っておきます。

パスワードをソースコードにベタ書きしない

これは絶対に覚えておいてください。
後で「環境変数に逃がす」書き方も見せます。


Node.js から MySQL に接続する基本

「mysql2 を使って“接続 → SELECT → 結果を見る”まで」

Node.js から MySQL に接続するには、専用のライブラリ(ドライバ)を使います。
今なら mysql2 を使うのが定番です。

1. ライブラリをインストールするイメージ

プロジェクトのディレクトリで、次のようにインストールします。

npm install mysql2

これで、Node.js から MySQL に話しかけるための部品が手に入ります。

2. 超シンプルな接続+SELECT の例

例えば、users テーブルから全件取得して表示するだけのスクリプトを考えます。

// db_test.js
const mysql = require('mysql2/promise');

async function main() {
  const connection = await mysql.createConnection({
    host: 'localhost',
    port: 3306,
    user: 'sample_user',
    password: 'secret_password',
    database: 'sample_app',
  });

  const [rows] = await connection.execute('SELECT id, name FROM users');
  console.log(rows);

  await connection.end();
}

main().catch(err => {
  console.error(err);
});
JavaScript

ここでやっていることを、順番に日本語にするとこうです。

mysql2/promise を読み込む(Promise/async 対応版)
createConnection で MySQL に接続する(接続情報を渡す)
connection.execute で SQL を投げる
返ってきた rows を console.log で表示する
最後に connection.end で接続を閉じる

重要なのは、「接続は非同期(async/await)」であることです。
DBとの通信は時間がかかるので、Node.js では必ず非同期で扱います。

3. パスワードを環境変数に逃がす

さっきのコードは説明用にベタ書きしましたが、実務ではやりません。
最低限、環境変数に逃がします。

# .env 的なイメージ
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=sample_user
export DB_PASSWORD=secret_password
export DB_NAME=sample_app
Python

Node.js 側では、こう読み込みます。

const mysql = require('mysql2/promise');

async function main() {
  const connection = await mysql.createConnection({
    host: process.env.DB_HOST,
    port: Number(process.env.DB_PORT),
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
  });

  const [rows] = await connection.execute('SELECT id, name FROM users');
  console.log(rows);

  await connection.end();
}

main().catch(console.error);
JavaScript

これで、ソースコード自体にはパスワードが残らず、
環境ごとに設定を変えやすくなります。


Python から MySQL に接続する基本

「mysql-connector-python で“接続 → SELECT → 結果を見る”まで」

Python でも、専用のライブラリを使って MySQL に接続します。
代表的なのは mysql-connector-pythonPyMySQL などですが、ここでは公式寄りの mysql-connector-python を使います。

1. ライブラリをインストールするイメージ

pip install mysql-connector-python

これで、Python から MySQL に接続するための部品が入ります。

2. 超シンプルな接続+SELECT の例

Node.js のときと同じく、users テーブルから全件取得して表示する例です。

# db_test.py
import os
import mysql.connector

def main():
    connection = mysql.connector.connect(
        host='localhost',
        port=3306,
        user='sample_user',
        password='secret_password',
        database='sample_app'
    )

    cursor = connection.cursor(dictionary=True)
    cursor.execute('SELECT id, name FROM users')
    rows = cursor.fetchall()

    for row in rows:
        print(row['id'], row['name'])

    cursor.close()
    connection.close()

if __name__ == '__main__':
    main()
Python

ここでやっていることを日本語にすると、

mysql.connector.connect で接続を作る
cursor を取得して SQL を実行する
fetchall で結果を全部取る
ループで1行ずつ表示する
最後に cursor と connection を閉じる

という流れです。

dictionary=True を付けることで、
結果が (1, 'Alice') のようなタプルではなく
{'id': 1, 'name': 'Alice'} のような辞書で返ってきます。
この方がカラム名でアクセスできて分かりやすいです。

3. Python でも環境変数で設定を持つ

同じく、パスワードのベタ書きは避けます。
環境変数から読む形に変えます。

# シェル側
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=sample_user
export DB_PASSWORD=secret_password
export DB_NAME=sample_app

Python 側はこうです。

import os
import mysql.connector

def main():
    connection = mysql.connector.connect(
        host=os.environ.get('DB_HOST', 'localhost'),
        port=int(os.environ.get('DB_PORT', '3306')),
        user=os.environ.get('DB_USER'),
        password=os.environ.get('DB_PASSWORD'),
        database=os.environ.get('DB_NAME')
    )

    cursor = connection.cursor(dictionary=True)
    cursor.execute('SELECT id, name FROM users')
    rows = cursor.fetchall()

    for row in rows:
        print(row['id'], row['name'])

    cursor.close()
    connection.close()

if __name__ == '__main__':
    main()
Python

Node.js と同じく、

接続情報はコードではなく環境に持たせる

というパターンを、最初から体に染み込ませておくと、
後でセキュリティ的に楽になります。


「アプリからDBに触るときの怖さ」を少しだけ意識する

「“SELECT だけ”から始めて、“書き込み系は慎重に”」

ここまでの例は、すべて SELECT だけです。
これは意図的です。

アプリから DB に触るとき、
SELECT は「読むだけ」なので、壊すリスクはありません。
一方、INSERT / UPDATE / DELETE は、
書き換え・削除を伴うので、一気にリスクが上がります。

特に、初心者がやりがちなのは、

WHERE を付け忘れた UPDATE / DELETE をアプリから流す
テスト用のコードを本番環境に向けて実行してしまう

といった事故です。

Day24 前半では、

まずは SELECT だけで「つながる感覚」を掴む
書き込み系は、トランザクションや権限を意識してから触る

という順番を意識しておいてください。

後半では、

プレースホルダを使った安全なパラメータ埋め込み
INSERT / UPDATE / DELETE とトランザクション
接続プール(connection pool)の考え方

など、もう一段実務寄りの話に進みます。


Day24 前半のまとめ

アプリから MySQL に接続するときに必要なのは、「どこにあるDBに」「どのユーザーとして」「どのDBを使うか」という接続情報(ホスト・ポート・DB名・ユーザー名・パスワード)であり、Node.js なら mysql2/promise を使って createConnectionexecute('SELECT ...')end()、Python なら mysql.connector.connectcursor.execute('SELECT ...')fetchall()close() という流れで、まずは「users テーブルから全件SELECTして表示する」程度のシンプルな処理から始めるのが良い。
パスワードや接続情報をソースコードにベタ書きするのは避け、Node.js では process.env.DB_...、Python では os.environ.get('DB_...') のように環境変数から読み込む形にしておくことで、環境ごとの切り替えやセキュリティを確保しやすくなり、まずは SELECT だけで“つながる感覚”を掴んだうえで、Day24 後半で扱うプレースホルダ付きクエリやトランザクション、接続プールなどの「書き込みを伴う実務的な連携」に進んでいく。

タイトルとURLをコピーしました