蒐集

鮮やかな憧憬

データベースをDjangoから触ってみる

概要

DjangomySQLを触るときの設定を書きます

準備

簡易掲示板的なやつを作ります。eclipsにこんな感じの構成のディレクトリをじゅんびします。*1
f:id:roboneco:20150317145232p:plain

自動で生成される人たち

  • settings.py Djangoの設定ファイル
  • urls.py URLとビューの対応付け
  • WSGI.py Djangoが動くために必要
  • manage.py よくわからんけどまあ放置

追加した人たち

  • admin.py 管理画面用のプログラム
  • forms.py フォーム用のプログラム
  • models.py Djangoのmodelが置かれる
  • views.py ビューがいっぱい書いてある

settings.py

本番環境ではsettings.pyをインクルードして必要部分だけ書き換えたrun_settings.pyを作るらしい。

接続するデータベースを記述します。*2

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR,'db.sqlite3') #デフォルトの設定ではこのようなファイル名
}
}

DATABASES = {
'default': {
'ENGINE': 'mysql.connector.django', #データベース何をつかうか
'NAME': 'develop_pybbs', #データベース名
'USER': 'develop', #データベースの管理者名
'PASSWORD': 'develop' #データベースのパスワード
}

INSTALLED_APPS
#どのパッケージを自動でロードするか
INSTALLED_APPS = (
'pybbs',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)

Internationalization
# Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/
#使用する文字
LANGUAGE_CODE = 'ja-jp'
#使用する時間の設定
TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

#Falseのが楽
USE_TZ = False

Djangoのサーバーを立ち上げる

% cd ~/Documents/workspace/testdjango/src/
% python manage.py runserver

実行結果の中に
Django version 1.7.6, using settings 'pybbs.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
という感じで出るのでhttp://127.0.0.1:8000/にブラウザからアクセスします。
とりあえず、なんか出たらオッケーです。

途中で既存の環境にDjangoを追加した時

プログラムのフォルダに行って、django-admin startproject (プロジェクト名) srcする。
例えば

django-admin startproject yuzubot src

こんな感じ。これで、自動生成のファイルができる。

models.py

#データベースのテーブルとカラムの作成を行う
#ブラウザで中身が見れたらいいよね
from django.db import models
#クラスがテーブルで、各項目がカラムに相当する
class Chain(models.Model):
word_1 = models.CharField("単語1", max_length=20) #表示の時に””ないが表示される
word_2 = models.CharField("単語2", max_length=20)
word_3 = models.CharField("単語3", max_length=20)
count = models.IntegerField("出現回数")

% python manage.py syncdb [16:23:12]
Operations to perform:
Synchronize unmigrated apps: yuzubot
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Creating table yuzubot_chain
Installing custom SQL...
Installing indexes...
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying sessions.0001_initial... OK

You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no): Y
Please enter either "yes" or "no": yes

管理者つくるか聞かれるのではいと答える。
とりあえずこれで、テーブルが作れた。

つぎにadmin.pyを作る。

admin.py

#どのモデルを管理画面に設定するか
from django.contrib import admin
from yuzubot.models import Chain

class ChainAdmin(admin.ModelAdmin):
list_display = ("id","word_1","word_2","word_3","count")
search_fields = ("word_1","word_2","word_3") #タプルなので、要素がひとつなら最後カンマがいる(二個以上なら必要無い)
admin.site.register(Chain, ChainAdmin)

% python manage.py runserver

http://127.0.0.1:8000/admin/にアクセス

Djangoでデータベースを扱う

Djangoでデータベースを扱うとき、Commandというのをつくる。それにより、Djangoがデータベースを扱ってくれる。(注意すべきは、このCommand以外のところでデータベースを扱う記述をしてもエラーが出る。必ずCommandに書く)(書いたCommandは他のメソッドと同じようにひいてくれば良い)
この形にする
f:id:roboneco:20150317165840p:plain

例えばこんな感じ

# encoding=utf-8
from django.core.management.base import BaseCommand

from yuzubot.models import Chain

class Command(BaseCommand): #絶対変えない

def handle(self, *args, **options): #絶対変えない
  #ここ以下に処理を書けば良い
#textデータの整形(あんまりかんけいない)
f = open(args[0])
for line in f:
line = line.strip()
data = line.split("\t")

#データベースの処理
chain = Chain()
chain.word_1=data[0]
chain.word_2=data[1]
chain.word_3=data[2]
chain.count=int(data[3])
chain.save()

コマンドラインからチェックするときは、サーバーを止めて、

python manage.py loadchain ../text.txt
python manage.py runserver

ブラウザからアクセスするとおっけー