【Django】データベースと接続する

Djangoで使えるデータベースは下記の3つです。

  • MySQL
  • PostgreSQL
  • SQLite

データベースの設定をする

データベース接続の設定はsettings.pyに記載があります。

SQLiteの場合

デフォルトでSQLiteの設定がされています。
SQLiteでは必要な設定は2つだけです。
ENGINE、NAME

django_app/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

他のデータベース接続の設定も見てみましょう。

MySQLの場合

django_app/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': データベース名,
    'USER': 利用者名,
    'PASSWORD': パスワード,
    'HOST': ホスト名,
    'PORT': '3306',
  }
}

今回はMySQLを使用するので下記のように設定しました。

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'mysql',
    'USER': 'user',
    'PASSWORD': '',
    'HOST': 'DESKTOP-162FN12',
    'PORT': '3306',
  }
}

MySQLのホスト名は下記コマンドで確認できます。

mysql> show variables like 'hostname';

PostgreSQLの場合

django_app/settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': データベース名,
    'USER': 利用者名,
    'PASSWORD': パスワード,
    'HOST': ホスト名,
    'PORT': '5432',
  }
}

テーブルを設計する

サンプルとして、連絡先テーブルを設計します。

  • 名前
  • メールアドレス
  • 性別
  • 年齢
  • 誕生日

モデルを作成する

テーブル設計ができたら、普通に考えれば設計をもとにデータベースにテーブルを用意します。
しかし、Djangoではデータベースにテーブルを作っておく必要はありません。
プロジェクトにデータベース関係のスクリプトを書いておけば、それをもとにデータベースにテーブルを自動生成してくれます。
テーブルの内容は「モデル」として用意します。
models.pyには下記の記載があります。
hello/models.py

from django.db import models

# Create your models here.

Contactモデルクラスの作成

models.pyを修正します。
hello/models.py

from django.db import models

class Contact(models.Model):
  name = models.CharField(max_length=100)
  mail = models.EmailField(max_length=200)
  gender = models.BooleanField()
  age = models.IntegerField(default=0)
  birthday = models.DateField()
    
  def __str__(self):
    return '<Contact:id=' + str(self.id) + ', ' + \
      self.name + '(' + str(self.age) + ')>'

__str__とは「テキストの値」を返すためのメソッドです。

マイグレーションを行う

モデルまで用意できたら次に行うのは「マイグレーション」という作業です。
マイグレーションは2つの作業からなります。

  1. マイグレーションファイルの作成
  2. マイグレーションの適用

マイグレーションファイルの作成は、コマンドプロンプトから下記コマンドにて実行します。

C:\django_app>python manage.py makemigrations 名前

今回はhelloに対してマイグレーションファイルの作成を行います。
事前にMySQLのドライバをインストールしておきます。

C:\django_app>pip install PyMySQL
Collecting PyMySQL
  Obtaining dependency information for PyMySQL from https://files.pythonhosted.org/packages/e5/30/20467e39523d0cfc2b6227902d3687a16364307260c75e6a1cb4422b0c62/PyMySQL-1.1.0-py3-none-any.whl.metadata
  Downloading PyMySQL-1.1.0-py3-none-any.whl.metadata (4.4 kB)
Downloading PyMySQL-1.1.0-py3-none-any.whl (44 kB)
   ---------------------------------------- 44.8/44.8 kB 170.1 kB/s eta 0:00:00
Installing collected packages: PyMySQL
Successfully installed PyMySQL-1.1.0

[notice] A new release of pip is available: 23.2.1 -> 23.3.2
[notice] To update, run: python.exe -m pip install --upgrade pip

manage.pyでPyMySQLを利用できるよう設定します。

#!/usr/bin/env python
import os
import sys
# PyMySQLを利用できるように以下を追記する
import pymysql

pymysql.install_as_MySQLdb()
# ...省略...

settings.pyにOPTIONSを追記する

# settings.pyにOPTIONSを追記する
# ...省略...
DATABASES = {
    'default': {
# ...省略...
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
# ...省略...

実際の設定

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'mysql',
    'USER': 'user',
    'PASSWORD': '',
    'HOST': 'DESKTOP-162FN12',
    'PORT': '3306',
    'OPTIONS': {
        'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
    },
  }
}

クライアントのインストール

C:\django_app>python3 -m pip install mysqlclient
Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases.

C:\django_app>python -m pip install mysqlclient
Collecting mysqlclient
  Obtaining dependency information for mysqlclient from https://files.pythonhosted.org/packages/f7/89/998d7dd34a3159a69da35593e147bc4082e8774a82c806debbef52393689/mysqlclient-2.2.1-cp312-cp312-win_amd64.whl.metadata
  Downloading mysqlclient-2.2.1-cp312-cp312-win_amd64.whl.metadata (4.6 kB)
Downloading mysqlclient-2.2.1-cp312-cp312-win_amd64.whl (202 kB)
   ---------------------------------------- 202.8/202.8 kB 682.8 kB/s eta 0:00:00
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.2.1

[notice] A new release of pip is available: 23.2.1 -> 23.3.2
[notice] To update, run: python.exe -m pip install --upgrade pip

マイグレーションファイルの作成

C:\django_app>python manage.py makemigrations hello
Migrations for 'hello':
  hello\migrations\0001_initial.py
    - Create model Contact

マイグレーションの適用

C:\django_app>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, hello, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying hello.0001_initial... OK
  Applying sessions.0001_initial... OK

マイグレーションファイルの確認
マイグレーションフォルダと「0001_initial.py」というマイグレーションファイルが作成されています。

hello/migrations/0001_initial.py

# Generated by Django 4.2.2 on 2023-12-29 13:51

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Contact',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('mail', models.EmailField(max_length=200)),
                ('gender', models.BooleanField()),
                ('age', models.IntegerField(default=0)),
                ('birthday', models.DateField()),
            ],
        ),
    ]

この中のoperationsという部分がモデルを作成するためのクラスになります。

MySQL側では、「hello_contact」というテーブル名でテーブルが作成されています。

参考URL:https://zenn.dev/ryo_kawamata/articles/mysql-connect-error

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。