LoginSignup
4
5

More than 3 years have passed since last update.

DjangoとMySQLと

Last updated at Posted at 2019-05-10

Django使ってMySQLのDBに接続してデータを記入したり、出力したり、してみたいと思います。
MySQLの設定とかは他のところを参考にしてほしいです。
注意:この記事ではMySQLを標準のDBとしては扱わず、外部のDBを操作するようにしています。
  :初心者なので間違いなどがあるので信じ込みすぎないでください。
ここではそれぞれ個別では使える状態を前提にやってきます。

使ってる環境

とりあえず使っている環境は
vagrant 2.0.2
Host:win10
guest:ubuntu 14.04.6
MySQL 0.0.2

準備

pipで入れていきましょう。
一応freezeで確認しましたが、抜けだったりいらないのがあるかも。

Terminal
pip install mysql
pip install mysql-connector-python-rf
pip install mysqlclient
pip install PyMySQL

これでいいはず。

MySQLの操作

テスト用にDB作って、テーブル作りましょう。
MySQLへの接続は以下のようにします。

Terminal
 mysql -u ユーザー名

既存のDBにアクセスする場合、

Terminal
mysql -h ホスト名 -u ユーザー名 -p

そしてこの後パスワード入力で起動します。
でわでわ、まずDBを作りましょう。

Terminal
create database DB;

DB名はtest_DBとしておきましょう。
作れたかどうかは下記のコマンドを実行すると見れますよ。

Terminal
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test_DB            |
+--------------------+

DBの一覧の中にtest_BDが入っていますね。作成できたようです。
このDBを使うので

Terminal
use DB

のように実行してtest_BDを使うように設定しておきましょう。
では、テーブルを作ってみましょう。今回作るテーブルはtest_Tableという名前で、

user_name age height weight song add_day

こんなでいいでしょうか。
ageは整数値、height,weightは浮動小数、User_Name,songは文字列データ、add_dayは日付データとしましょう。
それでは作りましょう。

Terminal
CREATE TABLE テーブル名( 
フィールド名  オプション, 
フィールド名  オプション,
...
フィールド名  オプション
);

こんな感じで追加できます。
今回の例でいくと、

Terminal
CREATE TABLE test_Table( 
user_name varchar(15), 
age int,
height float,
weight float,
song varchar(30), 
add_day  datetime
) DEFAULT CHARSET=utf8;

これで作成できます。最後にちょっと付け加わっているのは、
このテーブルを使うときは基本UTF8を使いますよーって明示的に指定しています。こうしないと日本語を入力したとき???と文字化けしてしまい、困ります。
データの入れ込みとかはDjangoで行うのでMySQLはここまで。
MySQLからはCtrl+Cで抜け出せます。

Djangoの準備をする

それではまずはプロジェクト作ってアプリを作りましょう。
これは前の記事で書いているので大体流します。

Terminal
django-admin startproject mysite
python manage.py startapp testapp

アプリのを追加して、

mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'testapp', # 追加
]

アプリのURLを読むようにして、

mysite/urls.py
from django.conf.urls import include #追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('testapp.urls')), # 追加
]

testappurls.pyを作成して、Viewを表示するようにして、

testapp/urls.py
from django.urls import path
from testapp import views

app_name = 'testapp'

urlpatterns = [
    path('', views.list_view, name='list_view'),
]

そして表示するためのviewを適当に作って

testapp/views.py
def list_view(request):
    return render(request, 'testapp/list_view.html')

そんでもってtestapp/templates/testapp/list_view.htmlを作る。
これで実行してみたら何もないページが表示されるはずです。

最後にmigrateしてスーパーユーザーを作りましょう。適当にadminにしていますが、お好みでどうぞ。

Terminal
python manage.py createsuperuser
> Username (leave blank to use 'vagrant'): admin
> Email address:
...

メアドは何も書かなくても大丈夫です。
パスワードを指定したとき、短かったり、よくありそうだったりしたら警告出るので、yでスルーしちゃいましょう。

Djangoからデータを追加してみる

viewの記述

とりあえず適当なデータを入力してみましょう。
testapp/views.pyをいじっていきます。

testapp/views.py
from django.shortcuts import render
import mysql.connector  # 追加
from datetime import datetime  # 追加


def list_view(request):
    user_name = request.user.username
    age = 17
    height = 186.2
    weight = 61.5
    song = 'きらりんロボのテーマ'
    add_day = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    connect = mysql.connector.connect(
        database='test_DB',
        user="root",
        charset='utf8'
    )
    cur = connect.cursor(dictionary=True)

    cur.execute(
        """
        INSERT INTO test_Table(
            user_name ,
            age,
            height ,
            weight,
            song,
            add_day
        )
        VALUES (%s,%s,%s,%s,%s,%s)
        """, [user_name, age, height, weight, song, add_day]
    )
    connect.commit()
    cur.execute('SELECT * FROM test_Table WHERE user_name  = %s', [request.user.username])
    rows = cur.fetchall()
    cur.close()
    connect.close()

    return render(request, 'testapp/list_view.html', context={
        'data': rows
    })

まず上の方で変数に適当なデータを与えておきます。
user_nameに入れているrequest.user.usernameはログインユーザー名を持ってくる命令です。

mysql.connector.connectのところでDBにアクセスしてます。既存のDBにアクセスしたい場合はhostとかpasswordとかが必要になるかもしれないので、適宜追加していきましょう。

接続出来たらconnect.cursorを使います。どうやらこれをするとMySQL側でコマンドを実行できるっぽい?のですが詳しくはわからないです。(おべんきょしないと)
ただ、この引数にdictionary=Trueとしているのは、データの出力を辞書型で行ってほしいのでこのように書いています。
cur.execute以下に実際に動作させたいコマンドを記入していきます。

一回目のexecuteはデータの挿入コードを実行しています。
DBへの変更系のコマンドはconnect.commit()を実行しないと適用されないっぽいので忘れないようにしましょう。

二回目のexecuteはデータの取得をしています。この命令だとテーブル上にあるユーザー名が特定のデータを持ってくる命令です。今回はrequest.user.usernameを指定しているので、ログインユーザー名と同じデータのみを持ってくることになるわけです。
出力結果をcur.fetchall()を用いることで出力します。
その後、close()で接続を終わらせています。
最後にcontextでテンプレートにデータを渡します。

テンプレートの記述

続いてテンプレートを編集していきましょう。

list_view.html
{{data.0}}

はい。データの表示だけでしたらこれで十分です。
実行してみましょう。

キャプチャ.PNG

データが表示されました。
でもユーザー名が表示できてませんね。これはまだログインしていないからです。
http://localhost:18000/admin/login/?next=/admin/へ移動して、ログインしましょう。
ログインは先ほど作ったスーパーユーザーで入れます。
ログインしたらもう一度トップに戻ってみましょう。キャプチャ.PNG

ユーザー名が記入されていますね。

ところでなんで{{data.0}}0が付いてるのでしょう。
これは全部のデータを表示するとわかります。(このページを起動するたびにデータを追加してるのでめちゃくちゃ多いかもしれないです。)
後ろの.0を消して実行してみましょう。
キャプチャ.PNG

小っちゃくてちょっとわかりにくいかもなんで少し簡単に表すと、

data
[
  {データたち},
  {データたち},
  
]

こんな感じにひとまとまりの辞書データがリストの中に1つずつ入っているのです。なので最初の一つ目を表示するには後ろに.0を記入する必要があるのです。
ではデータ群をそれぞれ1列ずつ表示してみましょう。テンプレートでforを回すことで表示できます。

list_view.html
{% for d in data %}
{{d}}<br>
{% endfor %}

キャプチャ.PNG

このように表示できました。
一応簡単に表示できましたがどうせなので見やすくリストにしてみましょう。

list_view.html
<table border="1">
    <thead>
    <tr>
        <th>ユーザー名</th>
        <th>年齢</th>
        <th>身長</th>
        <th>体重</th>
        <th></th>
        <th>追加日</th>
    </tr>
    </thead>
    <tbody>
    {% for d in data %}
    <tr >
        <td class="lead">{{d.user_name}}</td>
        <td class="lead">{{d.age}}</td>
        <td class="lead">{{d.height}}</td>
        <td class="lead">{{d.weight}}</td>
        <td class="lead">{{d.song}}</td>
        <td class="lead">{{d.add_day}}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

めちゃくちゃ適当ですが、実行してみると表になっていると思います。
キャプチャ.PNG

まとめ

同じこと調べまくってしまうので備忘録として書いてますん。
今回はMySQLのDBにアクセスして読み書きを行ってみました。
次回はこれに手を加えてユーザーの入力を書き込んでみたいと思います。
そいでは。

4
5
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
4
5