概要
前回はPythonAnywhereのDjangoを最新版にしました。
今回は、データベースをSQLiteからMySQLに変更してみます。
PythonAnyWhereの無料プランでは、ディスク容量が最大512MBに制限されています。これにはファイルや他のデータを含みますので、MySQLの容量もその範疇で使用することになります。
MySQLデータベースを作成する
PythonAnywhereのダッシュボードから[Databases] ページに移動し、MySQLを選択、パスワードを入力したあと、「Initialize MySQL」ボタンをクリックします。
すると「Initializing your MySQL database — this will take a minute or so.」と表示されて初期化が始まりますので、少し待ちます。

初期化が終了するとMySQL settingsページが表示されますので、下記情報を控えておきます。
- Database host address
- Username
- Password(作成時に入力したもの)
- Database Name (データベース名はユーザ名とDB名を$で連結したものです)
設定を変更する
migrateでテーブルを作成する前に、settings.pyで設定を変更します。
ファイルの編集は「bash console」でviエディタなどを使う方法もありますが、Fileマネージャを使用して編集する方が簡単です。Fileマネージャはトップ画面の右上「File」から起動できます。

Fileマネージャを起動した後、mysite⇒mysiteと辿るとsettings.pyがあるのでクリックして開きます。
そして、下記のように設定を書き換えてSaveボタンで保存します。
USE_L10Nは、無ければ追加します。また、赤い部分はデータベースを作成したときに控えておいたものに書き換えてください。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Database Name',
'USER': 'Username',
'PASSWORD': 'Password',
'HOST': 'Database host address',
'PORT': '3306',
}
}
仮想環境にmysqlclientをインストールする
ダッシュボードに戻ってBashコンソールを起動します。

Bashコンソールを起動したら、下記のように仮想環境に入ります。
もし、まだ仮想環境を作成していない場合は前回の記事を参考に仮想環境を作成してください。
01:16 ~ $ source .virtualenvs/myproject/bin/activate
(myproject) 01:16 ~ $
仮想環境に入った後、下記のようにmysqlclientをインストールします。
(myproject) 01:16 ~ $ pip install mysqlclient
下記のように表示されればインストールは成功しました。今回は、バージョン2.2.7がインストールされました。
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.2.7
(myproject) 01:25 ~ $
マイグレートを実行し管理サイトにアクセスする
mysqlclientがインストールできたら、次に、マイグレートを実行してMySQLにテーブルなどを作成します。
(myproject) 01:25 ~ $ cd ~/mysite
(myproject) 01:30 ~/mysite $ python manage.py migrate
下記のように表示されれば成功です。作成されるテーブルの種類は、インストールしているAPPやMIDDLEWAREによって変わってきますが、OKになっていれば問題ありません。
Operations to perform:
Apply all migrations: admin, auth, contenttypes, 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 sessions.0001_initial... OK
(myproject) 01:31 ~/mysite $
もしかすると、下記のような警告が表示されるかもしれません。
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https
://docs.djangoproject.com/en/5.2/ref/databases/#mysql-sql-mode
この警告は、MySQLの Strict Mode(厳密モード)が有効になっていないことを示しています。Strict Mode を有効にすると、データの整合性に関する問題(たとえば、長すぎる文字列が黙って切り捨てられるなど)を エラーとして検知できるようになります。
しかし、PythonAnywhereでは、MySQLの設定を直接変更することはできないようなので、settings.py
にある DATABASES
の設定を以下のように変更して対応しました。(これはお好みで)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Database Name',
'USER': 'Username',
'PASSWORD': 'Password',
'HOST': 'Database host address',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
ここまでできたら、ダッシュボードからWEBサイトを再起動します。

ここで、管理サイトにアクセスすると、恐らくログインエラーになるはずです。
何故なら、まだスーパーユーザを作成していません。
前回作成したユーザはSQLiteに保存されているものなので、改めて作成しなおす必要があります。
もし、エラーにならなずログインできたのなら、それは、依然としてSQLiteが使われている可能性がありますので、設定を見直し再起動を行ってください。
下記のようにスーパーユーザを作成します。
作成後、管理サイトにアクセスしてログインできることを確認してください。
(myproject) 01:44 ~/mysite $ python manage.py createsuperuser

MySQLをコマンドで操作する方法
ときにはMySQLのコマンドを使う必要があるかもしれません。その場合は、ダッシュボードから「Databases」を開いて、表示されたページのNameの下にあるデータベース名をクリックします。
するとMySQLコンソールが開きますので、あとはMySQLコマンドを使ってデータベースの操作ができます。
例えば、show databases;でデータベース一覧が表示され、useでデータベースを切り替えます。そのあと、show tables;とすればマイグレートで作成されたテーブルの一覧が表示されます。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 49703822
Server version: 8.0.40 Source distribution
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| xxxxxxxx$default |
+--------------------+
3 rows in set (0.06 sec)
mysql> use xxxxxxxx$default
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_xxxxxxxx$default |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
まとめ
今回はデータベースをSQLiteからMySQLに変更しました。
SQLiteではマルチユーザなどに対応できない部分が多いので、MySQLが使用できるのはうれしいです。
しかし、PythonAnywereの無料版では、アカウント全体の容量が512MBに制限されています。また、CPUにも制限がありますので、実運用の場合は有料版に切り替えた方がいいと思います。
MySQLへの切り替え方や操作方法は変わりません。
この記事が、どなたかのお役に立てば幸いです。
コメント