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

