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()
とやってみたら、これが思った通りの動作をしてくれた。ドンピシャでした。非常に気分がいいです。
この記事が気に入ったらサポートをしてみませんか?