6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラズパイにDjango 3.0.6の環境を構築(MySQL)

Last updated at Posted at 2020-05-26

ラズパイにdjango環境を構築します。したくなったので。
使用したラズパイは Raspberry pi 3B+ 。

Django環境の構築情報が調べると古いものばかりなのと、ラズパイにはMySQLが入らないのでmariadbで設定する際に苦戦したのでメモです。

作業内容を動画にしましたので、実際に設定している様子はこちらを確認してください。

バージョン確認

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.11 (stretch)
Release: 9
Codename: stretch
$ uname -a
Linux raspberry 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv71 GNU/Linux

アップデート

$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot

Python

最初からインストールされてるはずなので飛ばして良い。
バージョンが低い場合は3.7.xまでアップデートした方がいいかも。

$ sudo apt install python3 python3-dev
$ python3 -V
Python 3.7.3

Django

本体をインストール

$ sudo apt install python3-django
$ pip3 install Django==3.0.6
$ django-admin --version
3.0.6

$ pip3 list --outdated で最新バージョンか確認できる。

MySQL(mariadb)

MySQL自体はインストールできないのでmariadbをインストールする。

本体をインストール

$ sudo apt install mariadb-server
$ mysql --version
mysql  Ver 15.1 Distrib 10.3.22-MariaDB, for debian-linux-gnu (i686) using readline 5.2

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

$ sudo apt install libmariadb-dev
$ pip3 install --no-binary :all: mysqlclient
~ 
Successfully installed mysqlclient-1.4.6

初期設定

rootユーザーのパスワードを設定する。
'********'を任意のパスワードにする。

$ sudo -i
# mysql -u root
mysql> use mysql;
mysql> update user set plugin='' where user='root';
mysql> update user set password=password('********') where user='root';
mysql> flush privileges;

update文はまとめてしまっても良い。

select user,password,plugin from user; で設定情報を確認できる。
vlcsnap-2020-05-27-16h16m34s284.png

DBを作成

mysql> create database mydb;

プロジェクトを作成して起動

Djangoプロジェクトを作成

$ django-admin startproject mysite

設定を変更

settings.pyの以下の2点を変更する。

$ sudo nano mysite/mysite/settings.py

ALLOWED_HOSTS = []の[]に'*'を入力する。

settings.py
# ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']

初期ではsqlite3を指定しているんでコメントアウト(または削除)し、MySQLの設定を記述する。
NAMEには作成したDB名を指定する。
'********'を設定したパスワードにする。

settings.py
DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'root',
        'PASSWORD': '********',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

設定が正しく行えたか確認する

$ python3 mysite/manage.py migrate

vlcsnap-2020-05-27-16h15m56s570.png

問題がなければ起動

$ python3 mysite/manage.py runserver

起動したらブラウザで確認しよう。
ローカルの8000番ポートで接続できる。
http://127.0.0.1:8000

これで土台ができたのであとは参考サイトを見ながらアプリを作成できます。

image.png

お疲れさまでした。

トラブルシューティング

mysqlclientをインストールできない

Error Code 1とか以下の様な文言が出てインストールできない場合。

OSError: mysql_config not found

以下をインストールすること。

$ sudo apt install python3-dev libmariadb-dev

MySQLにrootユーザーで入れない。

rootユーザーのパスワードを忘れた場合、パスワードを再設定。

$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

パスワード再設定

MySQLをセーフモードで起動

$ sudo -i
# service mysqld stop
# mysqld_safe --skip-grant-tables &

rootユーザーのパスワードを設定

# mysql -u root
mysql> use mysql;
mysql> update user set plugin='' where user='root';
mysql> update user set password=password('********') where user = 'root';
mysql> flush privileges;

セーフモードで起動したMySQLを終了する

# kill -KILL [mysqld_safe のPID]
# kill -KILL [mysqld のPID]

※mysqldのPIDの調べ方

$ ps aux | grep mysqld

MySQLを起動させる

# service mysqld start

権限を再設定

※権限で怒られてなかったらやらなくていいです。コマンドの内容を理解して行ってください。
userテーブルを全削除してrootユーザーに全権限を付与してみます。

mysql> use mysql;
mysql> select * from user;
mysql> truncate table user;
mysql> flush privileges;
mysql> grant all privileges on *.* to root@localhost identified by '********' with grant option;
mysql> flush privileges;

セーフモードで起動しない場合

# mysqld_safe --skip-grant-tables &
$ 2018-08-05T15:34:57.6NZ mysqld_safe A mysqld process already exists

既に起動していると言われて怒られたら既に動いているプロセスを止めましょう。
上記にあるPIDを確認してKILLすること。

MySQLクライアントが無いと怒られる時

古い情報を見ながらやってると起きがちなやつ。

Error loading MySQLdb module: No module named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?

以前のバージョンでの解決策として $ pip install mysqlclient とかやったりsetting.pyに以下のようなプログラムを書くようで、エラーをそのまま調べるとこの情報ばかりでてくるけど、この解決策自体が古い。

settings.py
# この解決策は古いので削除してください
import pymysql
pymysql.install_as_MySQLdb()

django2.0からはpymysqlは非推奨となっているので、もしインストールしているならアンインストールしてください。
現在はmysqlclientを使うので、以下の内容でインストールしてください。

$ pip3 install --force-reinstall --ignore-installed --no-binary :all: mysqlclient

普通にインストール( $ pip3 install mysqlclient )するだけではdjangoは参照してくれない様で同様のエラーになります。

参考

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?