Add show_checkin_data_sql.py
This commit is contained in:
248
show_checkin_data_sql.py
Normal file
248
show_checkin_data_sql.py
Normal file
@ -0,0 +1,248 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
SQL直接実行版: 最近のGpsLogとCheckinImagesデータを表示
|
||||
Docker環境で動作
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
def run_db_query(query):
|
||||
"""
|
||||
PostgreSQLクエリを実行
|
||||
"""
|
||||
try:
|
||||
cmd = [
|
||||
'docker-compose', 'exec', '-T', 'db',
|
||||
'psql', '-U', 'admin', '-d', 'rogdb',
|
||||
'-c', query
|
||||
]
|
||||
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
cwd='/Volumes/PortableSSD1TB/main/GifuTabi/rogaining_srv_exdb-2/rogaining_srv'
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
return result.stdout
|
||||
else:
|
||||
print(f"❌ SQLエラー: {result.stderr}")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 実行エラー: {e}")
|
||||
return None
|
||||
|
||||
def show_recent_gpslog(days=7):
|
||||
"""
|
||||
最近のGpsLogデータを表示
|
||||
"""
|
||||
print(f"\n📍 GpsLog (過去{days}日間)")
|
||||
print("-" * 80)
|
||||
|
||||
query = f"""
|
||||
SELECT
|
||||
id,
|
||||
to_char(checkin_time, 'MM-DD HH24:MI:SS') as time,
|
||||
zekken_number,
|
||||
event_code,
|
||||
cp_number,
|
||||
CASE
|
||||
WHEN image_address IS NOT NULL AND image_address != '' THEN '✅'
|
||||
ELSE '❌'
|
||||
END as has_image,
|
||||
CASE
|
||||
WHEN length(image_address) > 50 THEN left(image_address, 47) || '...'
|
||||
ELSE coalesce(image_address, '')
|
||||
END as image_preview
|
||||
FROM rog_gpslog
|
||||
WHERE checkin_time >= NOW() - INTERVAL '{days} days'
|
||||
ORDER BY checkin_time DESC
|
||||
LIMIT 20;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
def show_recent_checkinimages(days=7):
|
||||
"""
|
||||
最近のCheckinImagesデータを表示
|
||||
"""
|
||||
print(f"\n🖼️ CheckinImages (過去{days}日間)")
|
||||
print("-" * 80)
|
||||
|
||||
query = f"""
|
||||
SELECT
|
||||
ci.id,
|
||||
to_char(ci.checkintime, 'MM-DD HH24:MI:SS') as time,
|
||||
left(cu.email, 15) as user_email,
|
||||
left(ci.team_name, 12) as team,
|
||||
left(ci.event_code, 10) as event,
|
||||
ci.cp_number,
|
||||
CASE
|
||||
WHEN ci.checkinimage IS NOT NULL AND ci.checkinimage != '' THEN '✅'
|
||||
ELSE '❌'
|
||||
END as has_file,
|
||||
CASE
|
||||
WHEN length(ci.checkinimage::text) > 30 THEN left(ci.checkinimage::text, 27) || '...'
|
||||
ELSE coalesce(ci.checkinimage::text, '')
|
||||
END as file_preview
|
||||
FROM rog_checkinimages ci
|
||||
LEFT JOIN auth_user cu ON ci.user_id = cu.id
|
||||
WHERE ci.checkintime >= NOW() - INTERVAL '{days} days'
|
||||
ORDER BY ci.checkintime DESC
|
||||
LIMIT 20;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
def show_table_stats():
|
||||
"""
|
||||
テーブル統計情報を表示
|
||||
"""
|
||||
print(f"\n📊 テーブル統計")
|
||||
print("-" * 50)
|
||||
|
||||
query = """
|
||||
SELECT
|
||||
'GpsLog' as table_name,
|
||||
count(*) as total_count,
|
||||
count(CASE WHEN image_address IS NOT NULL AND image_address != '' THEN 1 END) as with_image,
|
||||
to_char(min(checkin_time), 'YYYY-MM-DD') as oldest_date,
|
||||
to_char(max(checkin_time), 'YYYY-MM-DD HH24:MI') as latest_date
|
||||
FROM rog_gpslog
|
||||
UNION ALL
|
||||
SELECT
|
||||
'CheckinImages' as table_name,
|
||||
count(*) as total_count,
|
||||
count(CASE WHEN checkinimage IS NOT NULL AND checkinimage != '' THEN 1 END) as with_file,
|
||||
to_char(min(checkintime), 'YYYY-MM-DD') as oldest_date,
|
||||
to_char(max(checkintime), 'YYYY-MM-DD HH24:MI') as latest_date
|
||||
FROM rog_checkinimages;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
def show_event_stats():
|
||||
"""
|
||||
イベント別統計を表示
|
||||
"""
|
||||
print(f"\n🎯 イベント別統計 (GpsLog)")
|
||||
print("-" * 40)
|
||||
|
||||
query = """
|
||||
SELECT
|
||||
event_code,
|
||||
count(*) as checkin_count,
|
||||
count(CASE WHEN image_address IS NOT NULL AND image_address != '' THEN 1 END) as with_image_count,
|
||||
to_char(min(checkin_time), 'MM-DD') as first_checkin,
|
||||
to_char(max(checkin_time), 'MM-DD') as last_checkin
|
||||
FROM rog_gpslog
|
||||
GROUP BY event_code
|
||||
ORDER BY checkin_count DESC
|
||||
LIMIT 10;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
print(f"\n🖼️ イベント別統計 (CheckinImages)")
|
||||
print("-" * 40)
|
||||
|
||||
query = """
|
||||
SELECT
|
||||
event_code,
|
||||
count(*) as image_count,
|
||||
count(DISTINCT team_name) as unique_teams,
|
||||
to_char(min(checkintime), 'MM-DD') as first_image,
|
||||
to_char(max(checkintime), 'MM-DD') as last_image
|
||||
FROM rog_checkinimages
|
||||
GROUP BY event_code
|
||||
ORDER BY image_count DESC
|
||||
LIMIT 10;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
def show_recent_activity():
|
||||
"""
|
||||
最近のアクティビティを時系列で表示
|
||||
"""
|
||||
print(f"\n⏰ 最近のアクティビティ (時系列)")
|
||||
print("-" * 60)
|
||||
|
||||
query = """
|
||||
(
|
||||
SELECT
|
||||
'GpsLog' as source,
|
||||
checkin_time as timestamp,
|
||||
zekken_number as identifier,
|
||||
event_code,
|
||||
cp_number,
|
||||
CASE WHEN image_address IS NOT NULL AND image_address != '' THEN 'with_image' ELSE 'no_image' END as note
|
||||
FROM rog_gpslog
|
||||
WHERE checkin_time >= NOW() - INTERVAL '24 hours'
|
||||
)
|
||||
UNION ALL
|
||||
(
|
||||
SELECT
|
||||
'CheckinImages' as source,
|
||||
checkintime as timestamp,
|
||||
team_name as identifier,
|
||||
event_code,
|
||||
cp_number::text,
|
||||
'image_upload' as note
|
||||
FROM rog_checkinimages
|
||||
WHERE checkintime >= NOW() - INTERVAL '24 hours'
|
||||
)
|
||||
ORDER BY timestamp DESC
|
||||
LIMIT 15;
|
||||
"""
|
||||
|
||||
result = run_db_query(query)
|
||||
if result:
|
||||
print(result)
|
||||
|
||||
def main():
|
||||
"""
|
||||
メイン関数
|
||||
"""
|
||||
print("🏃♂️ ロゲイニング チェックインデータ表示ツール (SQL版)")
|
||||
print("=" * 80)
|
||||
|
||||
# 引数処理
|
||||
days = 7
|
||||
if len(sys.argv) > 1:
|
||||
try:
|
||||
days = int(sys.argv[1])
|
||||
except ValueError:
|
||||
print("⚠️ 日数は数値で指定してください (デフォルト: 7日)")
|
||||
days = 7
|
||||
|
||||
print(f"📅 過去{days}日間のデータを表示します")
|
||||
|
||||
# データ表示
|
||||
show_recent_gpslog(days)
|
||||
show_recent_checkinimages(days)
|
||||
show_table_stats()
|
||||
show_event_stats()
|
||||
show_recent_activity()
|
||||
|
||||
print(f"\n✅ 完了")
|
||||
print(f"\n使用方法: python3 {sys.argv[0]} [日数]")
|
||||
print(f"例: python3 {sys.argv[0]} 3 # 過去3日間のデータ")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user