2009年9月29日火曜日

Python + SQLIte でテーブル名を読み出す方法

 昨日はフィールド名を読み出したのだが、よく考えるとテーブル名も読み出さなくてはならない。
 検索すると、こんなページを発見。要は、sqlite_master というテーブルがわかればよいわけで。

# しかし、こういうことを「教えて!goo」で教えてもらうとは思わなかった (^^;
import sqlite3
con = sqlite3.connect("ecsite.sqlite")
c = con.cursor()
c.execute(u"select name from sqlite_master where type = 'table'")
tbl = []
for row in c:
tbl.append(row[0])
 こんな感じで実行すると、
C:\Python262\projs\db-test1>python test1.py
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_session
django_site
item
item_tags
itempage_tag
 こんな感じで出てくる。

 データーベーススペシャリストとしての知識がこんなところで生きてくる。

----
 必要なパラメータは出揃ったし、マンマシンインターフェイスは Tkinter を使って GUI でなんとかなりそう。

 明日からはプログラム本体のコーディングだ。

2009年9月28日月曜日

Python + SQLite3 でフィールド名を読み出す方法

 某 HP を Django を使って CMS化しようとしているのだが、データーベースの設計をいい加減 agile にやっているのでテーブルのフィールドがポンポン増える。
 そのたびに新しくデータベースを作り直す(データを入れなおす)のが面倒なので、データ移行ツールを作ることにした。

 言語は練習も兼ねて python。SQLite3 のインターフェースを標準装備しているのでチャチャと...、フィールド名が読めない。PHP では嫌でもついてくるようなのになぜ?

 結局一時間以上探し回って、なんとか出てきた。

import sqlite3

con = sqlite3.connect("ecsite.sqlite")

c = con.cursor()
c.execute(u"select * from item")
print c.description
 実行結果はこんな感じ
C:\Python262\projs\db-test1>python test1.py
(('id', None, None, None, None, None, None), ('item_code', None, None, None, Non
e, None, None), ('item_name', None, None, None, None, None, None), ('item_land_s
q', None, None, None, None, None, None), ('item_land_tubo', None, None, None, No
ne, None, None), ('price', None, None, None, None, None, None), ('start_date', N
one, None, None, None, None, None))
 ちなみに肝は cursor を実行してから execute を実行すること。これが逆だと None しか表示されない。英文の資料では execute しか見つけられず、日本語訳でやっと発見。

 英語読解力はまだまだだ。

2009年9月23日水曜日

Djang:3桁カンマ区切り

一時間以上探しまわってこちらのページを見つけた。

 C あたりなら標準関数でも出来るし、わからなくても力技でいける。
 そんなことを探すのに一時間もかかるというのが初めての言語を使うハードルだよなぁ。

 しかし、humanize って。こういう発想は C++ までで終わってる人にはないよなぁ。

Django:admin で日本語入力したらエラー

 Django 0.95 で動いていたコードを 1.00 で動かそうとすると、管理画面で日本語を入力しようとすると UnicodeEncodeError が。

 探しているとこんなページ(http://www.metareal.org/2008/04/11/django-unicode-encode-error/)を発見。あっさり解決。

 だけど __str__ を __unicode__ に変えるって、どこかで読んだなぁ。