pythonで、データを保持する処理をしたくなった。
最初はファイルに保存することを考えていたのだが、SQLiteが使えるようなので、それを使っている。
が、C APIではエラーで済むところで例外が返ってくるので、「成功したらそれでよいし、失敗してもそれはそれでよい」というような場合の処理を書くのが面倒だ。
特に、今はきっちりした処理を作っているわけではないので、その気持ちが強い。
たとえば、こんなコードを書いたとしよう。
conn = sqlite3.connect(DB_NAME) cur = conn.cursor() cur.execute('CREATE TABLE clients(filename TEXT, owner TEXT)')
DBファイルがないときは通るのだが、既にテーブルがあると例外が起こる。
Traceback (most recent call last): File "sqlitest.py", line xx, incur.execute('CREATE TABLE clients(filename TEXT, owner TEXT)') sqlite3.OperationalError: table clients already exists
じゃあ、こう書くか?
exists = os.path.exists(DB_NAME) conn = sqlite3.connect(DB_NAME) cur = conn.cursor() if not exists: print 'create new TABLE' cur.execute('CREATE TABLE clients(filename TEXT, owner TEXT)')
回避はできるのだけど、わざわざこれやるの?という気もしてしまう。
それに、SQLiteのことをやるのにファイルの有無で確認する、というところがすっきりしない。
もちろん、tryで囲んでしまえばよいのだけど、CREATEのところだけ囲むのも格好がよくない気がする。
うーーん・・・
と、探していると、こういうのがあった。
Python sqlite3.OperationalError Examples
IF NOT EXISTS ?
そういうのがあるんだ!
conn = sqlite3.connect(DB_NAME) cur = conn.cursor() cur.execute('CREATE TABLE IF NOT EXISTS clients(filename TEXT, owner TEXT)')
うん、例外が出なくなった。
そうね、SQLのことはSQLのことで済ませられるということなのね。。。
なんとわかりやすい。助かりました。
返信削除