PythonスクリプトでDjangoにデータを登録する

前の記事で作ったアパート部屋のデータベースに、管理画面からデータを登録できるようになったが、いちいち画面を開いて入力して登録するのが面倒くさい。

部屋データのCSVファイルを作って、Pythonスクリプトから一気にデータベースに登録してみる。

PythonスクリプトからDjangoのデータベースを操作するには、Django の manage.py スクリプトが参考になる。

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

スクリプトが Django の models モジュールを読み込めるようにするため、
DJANGO_SETTINGS_MODULE 環境変数がプロジェクトの settings.py を指すようにする。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

あとは csv ファイルを読みこんで Heyaモデルのインスタンスを作り、データを代入して保存(save)する。ただし、Windows環境で作った csvファイルは、文字列の文字コードが cp932 なので utf-8 に変換しなければならない。

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

import csv
from apartment.models import Heya

reader = csv.reader(open("kaijyu-1.csv"))

for r in reader:
    print r
    h = Heya()
    h.tanako = r[0].decode('cp932').encode('utf-8')
    h.bango = r[1]
    h.hirosa = r[2]
    h.yachin = r[3]
    h.save()

csvファイルは kaijyu-1.csv のファイル名で次のとおり。

ベムラー,101,2DK,35000
バルタン星人,102,2DK,35000
ネロンガ,103,1DK,30000
巨大ラゴン,201,2DK,36000
グリーンモンス,202,2DK,36000
ゲスラ,203,1DK,31000
アントラー,301,2DK,40000
レッドキング,302,2DK,40000
チャンドラー,303,1DK,37000

データを登録するスクリプトはプロジェクトのディレクトリ直下に保存して実行した。

これ以外のディレクトリでスクリプトを動作させるには、sys.path を設定してプロジェクトがどこにあるのかを Python に伝えておく必要がある。

このプロジェクトのディレクトリは c:\Users\skw\django\myproj なので、

sys.path.append(r'c:\Users\skw\django\myproj')

とすればよい。

たとえば、どこのディレクトリに置かれても、Djangoデータベースの内容を表示するスクリプトは次のとおり。

import sys
sys.path.append(r'c:\Users\skw\django\myproj')

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

from apartment.models import Heya

for h in Heya.objects.all():
    print h.tanako
    print h.bango
    print h.hirosa
    print h.yachin

Django のユーザ名とパスワードを忘れてしまった

あまりに長い間、Django を触っていなかったので、管理画面のユーザ名とパスワードを忘れてしまった。

さて、どうしようか。

Googleで検索したら同じ悩みの人がいて助かった。
【django】adminのパスワードを忘れた場合

Django の shell を起動して、User オブジェクトを直接触ってしまえば良いのであった。

> python manage.py shell

>>> from django.contrib.auth.models import User
>>> users = User.objects.all()
>>> user = users[0]
>>> user
<User: skw>
>>> user.set_password('mypass')
>>> user.save()

自分の ユーザ名 は skw ということが判明したので、パスワードを mypass にした。

Userオブジェクトの説明は下記リンクにあり、パスワード変更(set_password)も解説されていた。
Django でのユーザ認証 — Django 1.4 documentation

Django で dbshell を使う

さて、Django で管理されているデータベースの中身を操作するには、Django の管理画面からできるのがわかった。

当たり前のことだが、コマンドラインからデータベースに接続してデータを操作することもできる。

下記コマンドを実行すると、myproj/settings.py に設定したデータベース情報を読みこんでから該当するデータベースのシェルを起動してくれる。SQLite3 なんかだと、データベースと接続するときにuserid/password が必要ないからあまり恩恵はないけど、MySQLを使うときなどは、その都度にデータベース名、user名、passwordとか入力しないですむので便利に使える。

>manage.py dbshell

と思って実行したら、

>manage.py dbshell
'sqlite3' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

SQLite3のシェルがインストールされていないのでエラーがでてしまった。

■SQLite3のシェルをインストールする

SQLite の本家ページに目的のシェルがある。

SQLite Download Page

このページにある

Precompiled Binaries for Windows
sqlite-shell-win32-x86-3080100.zip

をダウンロードして展開すると、sqlite3.exe ができるので、

パスが通ったディレクトリにコピーすれば良い。

めんどうなんで、そのものずばり、プロジェクトディレクトリ myproj にコピーする。

さて、もういちど manage.py から実行してみる。

>manage.py dbshell

SQLite version 3.8.1 2013-10-17 12:57:35
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

うまく起動したもようです。

■sqlite.exe を使う

インストールしたものの、sqlite.exe の使い方が良くわからない

ヘルプは下記のコマンドを実行すると長々と表示されるので読んでみる。

sqlite> .help

テーブルの一覧を表示してみる

sqlite> .table
apartment_heya              auth_user_user_permissions
auth_group                  django_admin_log
auth_group_permissions      django_content_type
auth_permission             django_session
auth_user                   django_site
auth_user_groups

さきほど作った Heya テーブルの名前は apartment_heya であることがわかった。

さっそくテーブルの中身をみてみる。

sqlite> select * from apartment_heya;
1|101|繝吶Β繝ゥ繝シ|2DK|35000

なんか文字化けしている。

Django 管理画面での表示は以下ようになっているのだが、

django-5

「sqlite3.exe はデータを UTF-8 で出力するので、コマンドプロンプト上では文字化けしてしまう」(akahuku – sqlite shell)らしい。

ついでに、Django がどんなふうにテーブルを作ったのかをみてみる。

sqlite> .schema apartment_heya
CREATE TABLE "apartment_heya" (
    "id" integer NOT NULL PRIMARY KEY,
    "bango" varchar(20) NOT NULL,
    "tanako" varchar(50) NOT NULL,
    "hirosa" varchar(20) NOT NULL,
    "yachin" integer NOT NULL
);

Django がどんなふうにテーブルを作くるのかを確認する manage.py sql があるので表示して比較する。

>manage.py sql apartment
BEGIN;
CREATE TABLE "apartment_heya" (
    "id" integer NOT NULL PRIMARY KEY,
    "bango" varchar(20) NOT NULL,
    "tanako" varchar(50) NOT NULL,
    "hirosa" varchar(20) NOT NULL,
    "yachin" integer NOT NULL
)
;
COMMIT;

ほぼ同じですね。

フィール id は models.py では定義していないけれど、Django が暗黙に作成するものらしい。

まあ、ともかく dbshell も動いた。