Djangoで自作コマンドをmanage.py mycommandで実行する方法

2012-05-23
このエントリーをはてなブックマークに追加

Djangoでバッチファイルの実行をする方法です。

だいぶ前に「PythonでDjangoを使ったバッチ処理」で説明していますが、別のやり方です。というか、Djangoとしてはこっちが正しいんだと思います。

まずは任意のプロジェクトがあって、プロジェクトにappというアプリケーションが作成されているものとして進めます。

そこで、app(アプリケーションフォルダ)の下に「management」というフォルダを作成、中に__init__.pyを配置します。__init__.pyは空でいいです。

次に、managementフォルダの中に「commands」というフォルダを作成、またもやcommandsフォルダのなかに__init__.pyを配置します。もちろん、空で大丈夫です。

そして、commandsフォルダの中に「mycommand.py」を配置します。これが今回のメインになります。ここまでで以下の構成になっていると思います。

プロジェクトルート/
| app/
| | management/
| | | commands/
| | | | __init__.py
| | | | mycommand.py
| | | __init__.py
| | __init__.py
| | models.py
| | tests.py
| | views.py
| __init__.py
| manage.py
| settings.py
| urls.py

これでやっとバッチ処理が書けます。mycommand.pyを開いて、

#! /usr/local/bin/python
# -*- coding: utf-8 -*-

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def handle(self, *args, **options):
        print "hello command."

これでOK!

python manage.py mycommand

で実行できます。もちろんDjangoのmodelとかも触れます。*argsがあるから引数もOK!
こっちのほうがきれいにまとまりますね。

Python2.7、Django1.3.1で動作しています。試してませんが、もっと古いDjangoでも動くのではないかと。

Tags: ,

MySQLで最後に発行されたAUTO INCREMENTの値を変数に代入

2012-05-11
このエントリーをはてなブックマークに追加

MySQLにバッチファイルとかでデータ投入していく時、リレーションを張っている場合は子のテーブルには親テーブルのpkが必要になります。fkの値ですよね。

親テーブルにinsert、新たに発行されたpkの値を変数にいれて、そのまま続けて子テーブルにもinsertしていくサンプル。

久々に書こうとして「あれ?どうやって書いたっけ」って悩んでしまったのでメモしておこう。

insert into oya(body) values(‘hogehoge’);
SET @oya_id = (select last_insert_id() from oya);
insert into ko(oya_id, body) values(@oya_id, ‘ko-hogehoge’);

last_insert_id()ってMySQLだけかも。PostgreSQLとかは確か違う取得の仕方だったと。あ、もちろん各テーブルのpkになるidというカラムはAUTO INCREMENTです。

これを

mysql -u ユーザ名 DB名 < 上記クエリが書かれたファイルへのパス

って実行してやればOKかと。

ちなみにこんなテーブルです。

CREATE TABLE oya(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

CREATE TABLE ko(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
oya_id int(11) unsigned NOT NULL,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

Tags: ,

PythonからTokyo Cabinetを操作して全文検索を実装する-データの投入と検索

2012-05-02
このエントリーをはてなブックマークに追加

PythonからTokyo Cabinetを操作して全文検索を実装する-まずは環境構築の続き。データの投入と検索です。

#! /usr/bin/python
# -*- coding: utf-8 -*-

from tokyocabinet import table

tc = table.Table()
tc.open(‘test.tct’, table.TDBOWRITER | table.TDBOCREAT)

tc[‘key’] = {‘value’: ‘Hello Tokyo Cabinet’}

#トークン転置インデックスを作成
tc.setindex(‘value’, table.TDBITTOKEN)

#これは全レコードの件数
print len(tc)

#検索
q = tc.query()
q.addcond(‘value’, table.TDBQCSTRAND, ‘Tokyo’)

#ヒットした件数
print q.count()
#検索結果の出力
for item in q.search():

print item

tc.close()

インデックスの作成は毎回やる必要はないです。コードから作成するサンプルです。これでtest.tctというデータファイルとtest.tct.idx.value.tokというインデックスファイルが作成されます。

トークンは形態素解析して半角スペースでつなげたものを使いました。サンプルはその部分を割愛しましたが、「私負けましたわ」という文章を突っ込む場合には「私 負け まし た わ」となります。

相変わらずMeCabのお世話になってます。

正直パラメータとかは自信無いです。間違ってたらごめんなさい。

某QAサイトからサンプルデータをちょっとお借りして、200万件ほど投入して検索してみましたが、20ミリ秒くらいでヒット件数とレコードを取得できました。

手軽で高速。これはいろいろ活用してみたいですね。