Django で dbshell を使う
さて、Django で管理されているデータベースの中身を操作するには、Django の管理画面からできるのがわかった。
当たり前のことだが、コマンドラインからデータベースに接続してデータを操作することもできる。
下記コマンドを実行すると、myproj/settings.py に設定したデータベース情報を読みこんでから該当するデータベースのシェルを起動してくれる。SQLite3 なんかだと、データベースと接続するときにuserid/password が必要ないからあまり恩恵はないけど、MySQLを使うときなどは、その都度にデータベース名、user名、passwordとか入力しないですむので便利に使える。
>manage.py dbshell
と思って実行したら、
>manage.py dbshell 'sqlite3' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
SQLite3のシェルがインストールされていないのでエラーがでてしまった。
■SQLite3のシェルをインストールする
SQLite の本家ページに目的のシェルがある。
このページにある
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 管理画面での表示は以下ようになっているのだが、
「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 も動いた。