「動画URLの取り扱いでハマった罠」
TAKA: 今日は動画データベースを更新するスクリプトを走らせてみたんだけど、KeyError: ‘url’ ってエラーが出ちゃったよ。どういうこと?
AI老師: うむ、それはデータベースの構造が原因じゃな。スクリプトが url フィールドを期待しているのに、データベースの中にそのフィールドがない可能性が高い。データベースの内容を確認してみよう。
TAKA: え、データベースの中身を直接確認するってどうやるの?
AI老師: 大丈夫じゃ。MongoDBなら、ターミナルやGUIツールを使って確認できるぞ。今日はターミナルで確認する方法を教えよう。
問題解決へのステップ
- データベースの確認
AI老師: まずはデータベースの中にあるドキュメントの構造を確認するぞ。以下のようなコマンドを使えば簡単じゃ。
データベースの内容を取得するスクリプト例
from pymongo import MongoClient
client = MongoClient(‘mongodb+srv://your-mongo-uri/’)
db = client[‘my-video-finder’]
videos = db[‘videos’]
動画コレクションをすべて取得
for video in videos.find():
print(video)
TAKA: なるほど、これでデータの中身が見えるんだね。でも、url がなかったらどうすればいいの?
- データの整合性を修正
AI老師: url がない場合は、データを修正する必要がある。例えば、ダミーデータや欠損値を埋めるためのロジックを加えるんじゃ。
‘url’ フィールドがない場合の処理を追加
for video in videos.find():
if ‘url’ not in video:
print(f”Missing ‘url’ in: {video[‘_id’]}”)
# 必要ならデータを修正
videos.update_one({‘_id’: video[‘_id’]}, {‘$set’: {‘url’: ‘https://example.com/default-url’}})
TAKA: おお、これなら動きそう!
実際の修正内容
- スクリプトの修正
update_videos.py に以下の処理を追加してエラーを防ぐ。
def extract_video_id(url):
if not url:
return None
match = re.search(r’v=([a-zA-Z0-9_-]+)’, url)
if match:
return match.group(1)
return None
for video in videos.find():
if ‘url’ not in video or not video[‘url’]:
print(f”Skipping video with missing URL: {video[‘_id’]}”)
continue
video_id = extract_video_id(video[‘url’])
if video_id:
videos.update_one({‘_id’: video[‘_id’]}, {‘$set’: {‘video_id’: video_id}})
- デバッグ
エラーログを確認して再実行。
AI老師: この修正で、url が欠けているデータは無視されるようになったぞ。今後のデータ挿入時にも整合性を確認する癖をつけると良いな。
解決したのか?
解決したこと: KeyError: 'url' の原因を特定し、データの欠損に対応できるよう修正。
未解決の課題: データ入力時のバリデーションを自動化する必要がある。
TAKA: 老師、ありがとう!今日は本当に勉強になったよ。
AI老師: これでひとまず前進じゃな。次回はもっと洗練された方法を学んでいこう!