Djangoを仮想環境上に構築し、MySQLをデータべースとして構築してGitHubでバージョン管理する

# DjangoとMySQLを連携する方法 - Python 3.11のインストールからデータベース設定、GitHubへのSSH接続まで

このガイドでは、DjangoプロジェクトをMySQLデータベースに接続し、Python 3.11を使用して仮想環境を構築する手順を紹介します。さらに、GitとGitHubでのバージョン管理方法、SSHを使用してGitHubにリポジトリをプッシュする手順もカバーしています。
python3.12ではMySQLのmysqlclientを利用できなかったため備忘録として残しておきます。
Gitでバージョン管理もしたかったので加筆修正しました。

## 1. Python 3.11のインストール
まずは、UbuntuでPython 3.11を利用するために必要な手順を実行します。

### 1.1 Deadsnakes PPAを追加してPython 3.11をインストール
Ubuntuの標準リポジトリに含まれていないPythonの新しいバージョンをインストールするために、`Deadsnakes PPA`を追加します。

```bash
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.11 python3.11-venv python3.11-dev
```

### 1.2 仮想環境の作成と有効化
Python 3.11を使用して仮想環境を作成し、有効化します。

```bash
python3.11 -m venv venv
source venv/bin/activate
```

### 1.3 DjangoとMySQLクライアントのインストール
仮想環境が有効化された状態で、DjangoとMySQLクライアントをインストールします。

```bash
pip install django mysqlclient
```

## 2. GitとGitHubでのバージョン管理
DjangoプロジェクトをGitとGitHubでバージョン管理し、SSHを使用してリモートリポジトリに接続する手順を紹介します。

### 2.1 Gitの初期化
プロジェクトディレクトリでGitを初期化します。

```bash
cd /path/to/your/folder  # プロジェクトフォルダに移動
git init  # Gitリポジトリを初期化
```

### 2.2 リモートリポジトリの作成
GitHubで新しいリポジトリを作成し、ローカルリポジトリと接続します。

### 2.3 SSHキーの生成とGitHubへの登録
GitHubとSSH接続を行うために、SSHキーを生成し、GitHubに登録します。

1. **SSHキーの生成**:

   ```bash
   ssh-keygen -t ed25519 -C "your_email@example.com"
   ```
   ここで、`your_email@example.com` はGitHubアカウントに登録しているメールアドレスです。

2. **SSHエージェントを開始し、鍵を追加**:

   ```bash
   eval "$(ssh-agent -s)"
   ssh-add ~/.ssh/id_ed25519
   ```

3. **GitHubに公開鍵を追加**:

   公開鍵をクリップボードにコピーします。

   ```bash
   cat ~/.ssh/id_ed25519.pub
   ```
   表示された公開鍵をコピーし、GitHubの設定画面で「SSH and GPG keys」から「New SSH key」をクリックして追加します。

### 2.4 .gitignoreの設定
不要なファイルやディレクトリをGitで追跡しないようにするため、`.gitignore`ファイルを作成します。

```bash
touch .gitignore
```

`.gitignore`ファイルに以下のような設定を追加します。

```gitignore
venv/
__pycache__/
*.pyc
db.sqlite3
.env
```

### 2.5 ファイルの追加とコミット
プロジェクトのファイルを追加してコミットします。

```bash
git add .
git commit -m "Initial commit"
```

### 2.6 リモートリポジトリの追加
リモートリポジトリをSSHを使用して追加します。

```bash
git remote add origin git@github.com:your-username/your-repo.git
```

### 2.7 リモートリポジトリへのプッシュ
ローカルのコミットをGitHubのリモートリポジトリにプッシュします。

```bash
git branch -M main
git push -u origin main
```

## 3. MySQLユーザーの作成とデータベースの設定
次に、DjangoとMySQLを連携するために必要なユーザーとデータベースを作成し、適切な権限を設定します。

### 3.1 MySQLにログイン
MySQLの`root`ユーザーでログインします。

```bash
sudo mysql -u root -p
```

### 3.2 ユーザーの作成
Djangoで使用するユーザー`my_django_user`を作成し、パスワードを設定します。

```sql
CREATE USER 'my_django_user'@'localhost' IDENTIFIED BY 'password';
```

### 3.3 データベースの作成
Djangoプロジェクト用のデータベース`my_django_db`を作成します。

```sql
CREATE DATABASE my_django_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```

### 3.4 データベース権限の付与
作成したユーザー`my_django_user`に対してデータベース`my_django_db`への全ての権限を付与します。

```sql
GRANT ALL PRIVILEGES ON my_django_db.* TO 'my_django_user'@'localhost';
FLUSH PRIVILEGES;
```

### 3.5 権限の確認
ユーザーに適切な権限が付与されているか確認します。

```sql
SHOW GRANTS FOR 'my_django_user'@'localhost';
```

## 4. Djangoのデータベース設定の確認
Djangoプロジェクトの`settings.py`ファイルで、MySQLデータベースに接続するための設定を行います。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_django_db',  # 作成したデータベース名
        'USER': 'my_django_user', # 作成したユーザー名
        'PASSWORD': 'password',  # ユーザーのパスワード
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
```

## 5. マイグレーションの実行
仮想環境が有効化されていることを確認した上で、Djangoのマイグレーションを実行します。

```bash
python manage.py migrate
```

## 6. トラブルシューティング
DjangoとMySQLの連携中に発生する可能性のあるエラーと、その対処方法を紹介します。

### 6.1 MySQLのユーザー権限エラー (1044)
エラー `OperationalError: (1044, "Access denied for user 'my_django_user'@'localhost' to database 'my_django_db'")` は、ユーザーにデータベースへの権限が不足していることを意味します。この場合、`GRANT ALL PRIVILEGES` コマンドを再実行して権限を付与してください。

### 6.2 MySQLへの接続エラー (1045)
エラー `OperationalError: (1045, "Access denied for user 'my_django_user'@'localhost' (using password: YES)")` は、ユーザー名やパスワードに誤りがあるか、認証プラグインに問題があることを示しています。`settings.py` の設定を再確認し、`CREATE USER` コマンドで正しい認証プラグインを使用するようにしてください。

### 6.3 Django設定ファイルの再確認
`settings.py` に記載されているデータベース接続情報 (`USER`, `PASSWORD`, `NAME` など) が正しいか再確認してください。特にスペルミスや小文字・大文字の違いに注意してください。

```bash
python manage.py migrate
```

## 5. トラブルシューティング
DjangoとMySQLの連携中に発生する可能性のあるエラーと、その対処方法を紹介します。

### 5.1 MySQLのユーザー権限エラー (1044)
エラー `OperationalError: (1044, "Access denied for user 'my_django_user'@'localhost' to database 'my_django_db'")` は、ユーザーにデータベースへの権限が不足していることを意味します。この場合、`GRANT ALL PRIVILEGES` コマンドを再実行して権限を付与してください。

### 5.2 MySQLへの接続エラー (1045)
エラー `OperationalError: (1045, "Access denied for user 'my_django_user'@'localhost' (using password: YES)")` は、ユーザー名やパスワードに誤りがあるか、認証プラグインに問題があることを示しています。`settings.py` の設定を再確認し、`CREATE USER` コマンドで正しい認証プラグインを使用するようにしてください。

### 5.3 Django設定ファイルの再確認
`settings.py` に記載されているデータベース接続情報 (`USER`, `PASSWORD`, `NAME` など) が正しいか再確認してください。特にスペルミスや小文字・大文字の違いに注意してください。

## まとめ
- **Pythonのインストールと仮想環境のセットアップ**: Ubuntu上でPython 3.11をインストールし、仮想環境を構築しました。
- **MySQLでデータベースとユーザーの作成、および権限の付与**: MySQLユーザーとデータベースを作成し、Djangoからアクセスできるように権限を設定しました。
- **Django設定ファイルでのデータベース接続情報の設定**: `settings.py` にMySQL接続情報を正しく設定しました。
- **マイグレーションの実行とエラー対応**: マイグレーションを実行し、発生する可能性のあるエラーに対して適切に対処しました。

これらの手順を実行することで、DjangoプロジェクトとMySQLデータベースを正しく連携させることができます。