2024-08-15 少し修正。対象部分のマッチはすぐできるみたい。
import sqlite3
# SQLiteデータベースファイルのパスを指定
db_path = 'path_to_your_database.db'
target_string = 'search_string'
# データベースに接続
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# すべてのテーブルを取得
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
# 対象文字列を含むテーブルとカラムを保持するためのリスト
results = []
# すべてのテーブルをループ
for table in tables:
table_name = table[0]
# テーブルのカラムを取得
cursor.execute(f"PRAGMA table_info({table_name});")
columns = cursor.fetchall()
for column in columns:
column_name = column[1]
# 対象文字列を検索
query = f"SELECT COUNT(*) FROM {table_name} WHERE {column_name} LIKE ?"
cursor.execute(query, ('%' + target_string + '%',))
count = cursor.fetchone()[0]
if count > 0:
results.append({
'table': table_name,
'column': column_name,
'count': count
})
# 検索結果を表示
for result in results:
print(f"Table: {result['table']}, Column: {result['column']}, Count: {result['count']}")
# データベース接続を閉じる
conn.close()
結果。
python .\exec.py
Table: podcasts, Column: feed_url, Count: 69
Table: podcasts, Column: topic_url, Count: 68
Table: episodes, Column: guid, Count: 4840
Table: episodes, Column: content, Count: 6
Table: episodes, Column: download_url, Count: 8807
Table: chapters, Column: name, Count: 5
Table: relatedPodcasts, Column: url, Count: 3
と、これらに対して順番に新URLに置換していけばいいのかもしてないなぁ。
freenomのドメインがいつアクセスできなくなるかわからない状態に対応しておきます。
.backupファイルはどうもzipファイルのようです。
.zipに変更、解凍
pythonで確認
取りあえず無茶苦茶マッチする箇所が多いことが分かりました。
import sqlite3
def search_database(db_path, search_string):
# データベースに接続
conn = sqlite3.connect(db_path)
# カーソルを作成
cur = conn.cursor()
# 全てのテーブル名を取得
cur.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cur.fetchall()
# 結果を書き込むためのファイルを開く
with open('output.txt', 'w', encoding='utf-8') as file:
# 各テーブルを走査
for table in tables:
table_name = table[0]
file.write(f"Searching table {table_name}\n")
print(f"Searching table {table_name}")
# テーブルのカラム情報を取得
cur.execute(f"PRAGMA table_info({table_name});")
columns = cur.fetchall()
# 各カラムを走査
for column in columns:
column_name = column[1]
try:
cur.execute(f"SELECT * FROM {table_name} WHERE {column_name} LIKE ?;", (f"%{search_string}%",))
rows = cur.fetchall()
for row in rows:
file.write(f"Found in {table_name}.{column_name}: {row}\n")
print(f"Found in {table_name}.{column_name}: {row}")
except sqlite3.Error as e:
file.write(f"Cannot query column {column_name} in table {table_name}: {e}\n")
print(f"Cannot query column {column_name} in table {table_name}: {e}")
# コネクションをクローズ
conn.close()
# 検索したいデータベースのパスと文字列を指定して関数を呼び出し
search_database('podcastAddict.db', '検索文字列')