Dockerでデータベース操作をスマートに:bashから.sqlスクリプトを実行
Bash から .sql スクリプトを実行する方法
方法 1: mysql コマンドを使用する
最も基本的な方法は、mysql
コマンドと -e
オプションを使用して .sql スクリプトを実行することです。 以下の例では、script.sql
という名前のスクリプトを mydb
というデータベースに対して実行します。
mysql -u username -p -D mydb < script.sql
オプションの説明:
-u username
: MySQL ユーザー名を指定します。-p
: パスワード入力を求めます。-D mydb
: データベース名を指定します。< script.sql
: 実行する .sql スクリプトファイルを指定します。
方法 2: シェルスクリプトを使用する
より柔軟な方法として、シェルスクリプトを使用して .sql スクリプトを実行することができます。 これにより、条件分岐やエラー処理などのロジックを追加することができます。
#!/bin/bash
# MySQL ユーザー名
USERNAME="username"
# データベース名
DATABASE="mydb"
# 実行する .sql スクリプト
SCRIPT="script.sql"
# パスワードを入力
password=$(whiptail --passwordbox "MySQL パスワードを入力してください" 8 20)
# エラー処理
if [ -z "$password" ]; then
echo "パスワードが空です。"
exit 1
fi
# mysql コマンドを実行
mysql -u $USERNAME -p"$password" -D $DATABASE < $SCRIPT
方法 3: Docker を使用する
もしあなたが既に Docker を使用している場合は、Docker コンテナを使用して .sql スクリプトを実行することができます。 以下の例では、mysql
イメージを使用して script.sql
スクリプトを mydb
データベースに対して実行します。
docker run --rm -it \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=mydb \
-v /path/to/script.sql:/docker-entrypoint-initdb.d/script.sql \
mysql:latest
--rm
: コンテナを終了時に自動的に削除します。-it
: コンテナ内に入ります。-e MYSQL_ROOT_PASSWORD=password
: MySQL root ユーザーのパスワードを設定します。-e MYSQL_DATABASE=mydb
: データベース名を指定します。-v /path/to/script.sql:/docker-entrypoint-initdb.d/script.sql
: ホストマシンの .sql スクリプトをコンテナ内の/docker-entrypoint-initdb.d/script.sql
にマウントします。
補足事項:
- 上記の例はすべて、パスワードなしで MySQL に接続することを前提としています。 パスワードを設定している場合は、上記のコマンドを修正する必要があります。
- スクリプトを実行する前に、.sql ファイルの所有権とパーミッションが正しいことを確認してください。 スクリプトが MySQL ユーザーに読み取り可能である必要があります。
- より複雑なタスクを実行する場合は、
mysqldump
コマンドと組み合わせて .sql スクリプトを使用することができます。
これらの方法のいずれかを使用して、bash から .sql スクリプトを簡単に実行することができます。 自分に合った方法を選択して、データベース操作を効率化してください。
#!/bin/bash
# MySQL ユーザー名
USERNAME="your_username"
# データベース名
DATABASE="your_database"
# 実行する .sql スクリプト
SCRIPT="path/to/your/script.sql"
# パスワードを入力
password=$(whiptail --passwordbox "MySQL パスワードを入力してください" 8 20)
# エラー処理
if [ -z "$password" ]; then
echo "パスワードが空です。"
exit 1
fi
# mysql コマンドを実行
mysql -u $USERNAME -p"$password" -D $DATABASE < $SCRIPT
このコードをどのように使用するのか、以下に説明します:
- USERNAME 変数に MySQL ユーザー名を、DATABASE 変数にデータベース名、SCRIPT 変数に実行する .sql スクリプトのパスを置き換えます。
- スクリプトを保存して、実行可能にします。 以下のコマンドを実行します。
chmod +x your_script.sh
- 以下のコマンドを実行して、スクリプトを実行します。
./your_script.sh
- パスワードを求められますので、MySQL パスワードを入力します。
- スクリプトが実行されると、
script.sql
内の SQL ステートメントがmydb
データベースに対して実行されます。
このサンプルコードを参考に、自分のニーズに合わせてカスタマイズすることができます。
psql コマンドを使用する (PostgreSQL の場合)
psql -U username -d mydb -f script.sql
mysqli -u username -p -D mydb < script.sql
Python スクリプトを使用する
import subprocess
# MySQL ユーザー名
USERNAME = "your_username"
# データベース名
DATABASE = "your_database"
# 実行する .sql スクリプト
SCRIPT = "path/to/your/script.sql"
# パスワード
PASSWORD = "your_password"
# コマンドを実行
subprocess.run(["mysql", "-u", USERNAME, "-p", "-D", DATABASE, "<", SCRIPT], input=PASSWORD.encode())
<?php
$dbhost = "localhost";
$dbusername = "your_username";
$dbpassword = "your_password";
$dbname = "your_database";
// データベース接続
$conn = new mysqli($dbhost, $dbusername, $dbpassword, $dbname);
// エラー処理
if ($conn->connect_error) {
die("接続失敗: " . $conn->connect_error);
}
// SQL ファイルを読み込む
$sql = file_get_contents("script.sql");
// SQL ステートメントを実行
if ($conn->multi_query($sql)) {
do {
if ($result = $conn->store_result()) {
while ($row = $result->fetch_assoc()) {
// 結果を処理
}
$result->close();
}
} while ($conn->more_results() && $conn->next_result());
} else {
echo "SQL 実行エラー: " . $conn->error;
}
$conn->close();
留意点
- パスワードをスクリプト内に直接記述することは避けてください。 代わりに、環境変数や外部ファイルを使用するようにしてください。
- データベース操作を行う前に、必ずバックアップを取っておいてください。
mysql database linux