DB Browser for SQLiteで行った変更をCLIで確認すると反映されてないことに気づいた。
CLIとは対話型インターフェースのこと。一方でDB Browser for SQLiteはGUIでsqliteを操作することができる。タイトルのトラブルはかなり初歩的なミスにより起こったので備忘録および情報の拡散を目的にここに書いておくことにする。
対話型インターフェースはpython+sqlite3+powershellで作成している。
PowerShellでインタラクティブな簡易インターフェースをつくる
pythonの構文に罠あり
罠というか気づけよって感じの案件だが、例えば以下のようなコードがあるとする。↓これはテーブルを作成するコードだ。
# sqlite3モジュールの読み込み
import sqlite3
# テーブル一覧を表示する関数
def printtable():
print("☆☆☆テーブル一覧☆☆☆")
c.execute("select * from sqlite_master where type='table'")
for x in c.fetchall():
print(x)
print("☆☆☆☆☆☆☆☆☆☆☆☆")
# データベースに接続
conn = sqlite3.connect("database.sqlite")
# カーソルオブジェクトの作成
c = conn.cursor()
# テーブル一覧の表示
printtable()
# 新しいテーブルの名前
print("\n")
tablename = input("新しいテーブルを作成します。テーブル名を入力してください: ")
print("\n")
c.execute("select count(*) from sqlite_master where type='table' and name='%s'" % tablename)
# sql = "create table if not exists users(id integer primary key, name text, address text)"
# テーブルが存在しないとき
if c.fetchone() == (0,):
# テーブル作成のSQL文:
sql = "create table %s (id integer primary key, name text, address text)" % tablename
# sql文の実行
c.execute(sql)
# コミット
conn.commit()
# 確認
print(str(tablename) + "テーブルを作成しました\n")
else:
print(str(tablename) + "テーブルはすでに存在しています。\n")
# テーブル一覧を表示
printtable()
# 終了
print("\n")
input("エンターキーで終了します: ")
#python
conn.close()
このコードの13行目にconn = sqlite3.connect(“database.sqlite”)という構文がある。ここに落とし穴がある。実は.connect()メソッドの引数であるパスは、カレントディレクトリを参照しているのである。(当たり前か!)
ここで奇妙な挙動があることにも着目したい。実はカレントディレクトリに目的のデータベースがファイルが無かった場合「自動で作成される」のである。そのためこのミスに気づくのに時間がかかってしまった。自分で作ったオリジナルのディレクトリにあるデータベースで作業していると思い込んでいた。
結局どうしたの?
結局のところDB Browser for SQLiteで行った変更は反映されているが、CLI操作で参照しているファイルが違ったので、「反映されてない」という錯覚に陥ってしまった。
つまりは、pythonコードのパスを「絶対パス」もしくは「相対パス」でただしく、記述しなければならない。
conn = sqlite3.connect(".\xxxx\xxxx\database.sqlite")
上記コードの .ピリオド はカレントディレクトリだ。これは「相対パス」の書き方になる。
かなり初歩的なミスであたふたしてしまったが事なきを得ることができた。

コメント