見出し画像

SQLiteのテーブル自動作成が便利

(Python学習初心者の試行錯誤・備忘録です)
 今回のはやってみたところ、便利すぎて感動した件を書き留めておきます。経験値が上がった気がします(笑)

背景

 Pythonのプログラムから、SQLiteを使う話は一月ほど前のこの記事で

などと書いています。以来、自分は
・DBファイルと、中身のテーブルは別ツールの「DB Browser for SQLite」で、作成、準備する。
・Pythonのプログラムからは、「お膳立てが整った」DBファイルにアクセスする。
と言うやり方をしていました。

課題

結果起きたことは、実行ファイルを別のフォルダにコピーしたりいろいろしているうちに、テーブルが入っている"mydb.sqlite3"ファイルと「生き別れ」になってしまうことです。
 「生き別れ」状態で、

con =sqlite3.connect('mydb.sqlite3')

とやると、存在しない'mydb.sqlite3'ファイルを自動作成してくれる。でもそのファイルの中には、利用を予定していたテーブルは存在しません。このため、「テーブルが無いよ」というエラーになる。
 ほかのフォルダにある「テーブルがある正しい」'mydb.sqlite3'ファイルを探して入れ替えなきゃいけないんだけど、ファイル名同じだからどちらが「本物」か、一見してもわからず、イライラさせられました。

解決へ

DBファイル本体が「無ければ作」るという仕組みになっているなら、テーブルだって「無ければ作」ればいいじゃない。
 早速Copilotに依頼。

import sqlite3

# データベースに接続(データベースが存在しない場合は新規作成)
conn = sqlite3.connect('example.db')

# カーソルオブジェクトを作成
c = conn.cursor()

# t_nameという名前のテーブルが存在するかどうかをチェック
c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='t_name'")

# 結果を取得
result = c.fetchone()

# テーブルが存在しない場合は作成
if not result:
    c.execute('''CREATE TABLE t_name (
                 id INTEGER PRIMARY KEY AUTOINCREMENT,
                 column1 TEXT NOT NULL,
                 column2 INTEGER NOT NULL)''')
    print('テーブル t_name を作成しました。')

# 変更をコミット
conn.commit()

# 接続を閉じる
conn.close()

なるほど・・自分は最近覚えたwith文を使った書き方で・・

#データベースのテーブル確認、無ければ作る。
with sqlite3.connect(mydb) as con:
    cur = con.cursor()
    cur.execute("SELECT name FROM sqlite_master WHERE type ='table' AND name = 't_shengci' ")
    result = cur.fetchone()
    if not result:
        con.execute('''CREATE TABLE "t_shengci" (
            "id"	INTEGER,
            "hanzi"	TEXT NOT NULL,
            "pinyin" TEXT,
            "level"	INTEGER DEFAULT 0,
            "timestamp"	TEXT DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY("id" AUTOINCREMENT)
            )''')
        print('テーブルt_shengciを作成')
    else:
        print('テーブルt_shengciは既にある')
    con.commit()

とやってみたら、これが思った通りの動作をしてくれた。ドンピシャでした。非常に気分がいいです。

この記事が気に入ったらサポートをしてみませんか?