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 も動いた。

Django

Posted by skw