2016/11/15

[py]sqlite3でテーブルがあるときに出る例外がうっとうしい

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, in 
    cur.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のことで済ませられるということなのね。。。

1 件のコメント:

  1. 匿名11:51

    なんとわかりやすい。助かりました。

    返信削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。