Tomofumi Ogawa commited on
Commit ·
f8d69d4
1
Parent(s): bbe25a4
migrateスクリプト追加
Browse files
migrate_kids_available_type.py → migrations/migrate_kids_available_type.py
RENAMED
|
@@ -1,7 +1,15 @@
|
|
|
|
|
|
|
|
| 1 |
import boto3
|
|
|
|
| 2 |
from decimal import Decimal
|
| 3 |
import time
|
| 4 |
from datetime import datetime, timezone, timedelta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
from config.logger import logger
|
| 6 |
|
| 7 |
class KidsAvailableTypeMigration:
|
|
@@ -15,7 +23,7 @@ class KidsAvailableTypeMigration:
|
|
| 15 |
"""
|
| 16 |
self.dynamodb = boto3.resource('dynamodb', region_name=region_name)
|
| 17 |
self.environment = environment
|
| 18 |
-
self.table_name =
|
| 19 |
self.table = self.dynamodb.Table(self.table_name)
|
| 20 |
logger.info(f"初期化完了: テーブル {self.table_name}")
|
| 21 |
|
|
@@ -79,13 +87,8 @@ class KidsAvailableTypeMigration:
|
|
| 79 |
# DynamoDBのキー構成に基づいて更新
|
| 80 |
current_time = self.get_current_time_jst_ns()
|
| 81 |
|
| 82 |
-
# テーブルにソートキーがある場合とない場合に対応
|
| 83 |
-
key = {'shop_id': shop_id}
|
| 84 |
-
if shop_name_ja:
|
| 85 |
-
key['shop_name_ja'] = shop_name_ja
|
| 86 |
-
|
| 87 |
response = self.table.update_item(
|
| 88 |
-
Key=
|
| 89 |
UpdateExpression='SET kids_available_type = :val, updated_at = :updated_at',
|
| 90 |
ExpressionAttributeValues={
|
| 91 |
':val': kids_available_type_value,
|
|
@@ -224,55 +227,45 @@ class KidsAvailableTypeMigration:
|
|
| 224 |
return verification_stats
|
| 225 |
|
| 226 |
|
| 227 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 228 |
"""
|
| 229 |
-
メイン
|
| 230 |
-
使用例:
|
| 231 |
-
- ドライラン: python migrate_kids_available_type.py
|
| 232 |
-
- 実際の実行: python migrate_kids_available_type.py --execute
|
| 233 |
"""
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
# 環境変数から環境を取得(デフォルトはdev)
|
| 237 |
-
import os
|
| 238 |
-
environment = os.getenv('ENVIRONMENT', 'dev')
|
| 239 |
|
| 240 |
-
|
| 241 |
-
dry_run = '--execute' not in sys.argv
|
| 242 |
-
|
| 243 |
-
if dry_run:
|
| 244 |
logger.info("ドライランモードで実行します。実際の更新は行われません。")
|
| 245 |
logger.info("実際に更新を実行する場合は --execute オプションを付けてください。")
|
| 246 |
-
else:
|
| 247 |
-
logger.info("実際の更新を実行します。")
|
| 248 |
-
response = input("本当に実行しますか? (yes/no): ")
|
| 249 |
-
if response.lower() != 'yes':
|
| 250 |
-
logger.info("実行をキャンセルしました。")
|
| 251 |
-
return
|
| 252 |
|
| 253 |
# マイグレーション実行
|
| 254 |
migration = KidsAvailableTypeMigration(environment=environment)
|
| 255 |
-
|
| 256 |
-
try:
|
| 257 |
-
# マイグレーション実行
|
| 258 |
-
stats = migration.migrate_all_shops(dry_run=dry_run)
|
| 259 |
-
|
| 260 |
-
# 実際に更新した場合は検証も実行
|
| 261 |
-
if not dry_run:
|
| 262 |
-
logger.info("マイグレーション完了。検証を開始します...")
|
| 263 |
-
time.sleep(2) # DynamoDBの整合性のため少し待機
|
| 264 |
-
verification_stats = migration.verify_migration()
|
| 265 |
-
|
| 266 |
-
# 検証結果をチェック
|
| 267 |
-
if verification_stats['incorrect_mapping'] == 0 and verification_stats['missing_kids_available_type'] == 0:
|
| 268 |
-
logger.info("✅ マイグレーションは正常に完了しました!")
|
| 269 |
-
else:
|
| 270 |
-
logger.error("❌ マイグレーションに問題があります。ログを確認してください。")
|
| 271 |
-
|
| 272 |
-
except Exception as e:
|
| 273 |
-
logger.error(f"マイグレーション中にエラーが発生しました: {str(e)}")
|
| 274 |
-
raise
|
| 275 |
|
| 276 |
|
| 277 |
if __name__ == "__main__":
|
| 278 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import os
|
| 3 |
import boto3
|
| 4 |
+
from botocore.exceptions import ClientError
|
| 5 |
from decimal import Decimal
|
| 6 |
import time
|
| 7 |
from datetime import datetime, timezone, timedelta
|
| 8 |
+
import argparse
|
| 9 |
+
|
| 10 |
+
# Add the project root directory to the Python path
|
| 11 |
+
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| 12 |
+
|
| 13 |
from config.logger import logger
|
| 14 |
|
| 15 |
class KidsAvailableTypeMigration:
|
|
|
|
| 23 |
"""
|
| 24 |
self.dynamodb = boto3.resource('dynamodb', region_name=region_name)
|
| 25 |
self.environment = environment
|
| 26 |
+
self.table_name = get_table_name(environment)
|
| 27 |
self.table = self.dynamodb.Table(self.table_name)
|
| 28 |
logger.info(f"初期化完了: テーブル {self.table_name}")
|
| 29 |
|
|
|
|
| 87 |
# DynamoDBのキー構成に基づいて更新
|
| 88 |
current_time = self.get_current_time_jst_ns()
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
response = self.table.update_item(
|
| 91 |
+
Key={'shop_id': shop_id},
|
| 92 |
UpdateExpression='SET kids_available_type = :val, updated_at = :updated_at',
|
| 93 |
ExpressionAttributeValues={
|
| 94 |
':val': kids_available_type_value,
|
|
|
|
| 227 |
return verification_stats
|
| 228 |
|
| 229 |
|
| 230 |
+
def get_table_name(environment):
|
| 231 |
+
"""環境に応じたDynamoDBのテーブル名を取得する"""
|
| 232 |
+
if environment == 'production':
|
| 233 |
+
return 'prod-shops'
|
| 234 |
+
elif environment == 'development':
|
| 235 |
+
return 'dev-shops'
|
| 236 |
+
elif environment == 'staging':
|
| 237 |
+
return 'stg-shops'
|
| 238 |
+
else:
|
| 239 |
+
# デフォルトは 'dev-shops'
|
| 240 |
+
return 'dev-shops'
|
| 241 |
+
|
| 242 |
+
|
| 243 |
+
def main(environment):
|
| 244 |
"""
|
| 245 |
+
マイグレーションのメイン処理
|
|
|
|
|
|
|
|
|
|
| 246 |
"""
|
| 247 |
+
# 引数で実行モードを切り替える
|
| 248 |
+
is_dry_run = '--execute' not in sys.argv
|
|
|
|
|
|
|
|
|
|
| 249 |
|
| 250 |
+
if is_dry_run:
|
|
|
|
|
|
|
|
|
|
| 251 |
logger.info("ドライランモードで実行します。実際の更新は行われません。")
|
| 252 |
logger.info("実際に更新を実行する場合は --execute オプションを付けてください。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
|
| 254 |
# マイグレーション実行
|
| 255 |
migration = KidsAvailableTypeMigration(environment=environment)
|
| 256 |
+
migration.migrate_all_shops(dry_run=is_dry_run)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
|
| 258 |
|
| 259 |
if __name__ == "__main__":
|
| 260 |
+
"""
|
| 261 |
+
実行コマンド例:
|
| 262 |
+
- ドライラン: python migrate_kids_available_type.py
|
| 263 |
+
- 実際の実行: python migrate_kids_available_type.py --execute
|
| 264 |
+
"""
|
| 265 |
+
parser = argparse.ArgumentParser(description='kids_available_type のマイグレーションスクリプト')
|
| 266 |
+
parser.add_argument('--env', type=str, default='development', choices=['development', 'production', 'staging'], help='実行環境')
|
| 267 |
+
parser.add_argument('--execute', action='store_true', help='このフラグを付けると実際にDBを更新します')
|
| 268 |
+
args = parser.parse_args()
|
| 269 |
+
|
| 270 |
+
# 環境変数から環境を取得(デフォルトはdev)
|
| 271 |
+
main(args.env)
|
migration_readme.md → migrations/migration_readme.md
RENAMED
|
@@ -12,7 +12,7 @@ DynamoDBの`shops`テーブルに新規カラム`kids_available_type`を追加
|
|
| 12 |
|
| 13 |
## 値の意味
|
| 14 |
|
| 15 |
-
- `kids_available_type = -1`: 子連れ
|
| 16 |
- `kids_available_type = 1`: 子連れ可
|
| 17 |
|
| 18 |
## 使用方法
|
|
|
|
| 12 |
|
| 13 |
## 値の意味
|
| 14 |
|
| 15 |
+
- `kids_available_type = -1`: 子連れ非表示
|
| 16 |
- `kids_available_type = 1`: 子連れ可
|
| 17 |
|
| 18 |
## 使用方法
|
test_migration.py → migrations/test_migration.py
RENAMED
|
File without changes
|
test_shop.py → test/test_shop.py
RENAMED
|
File without changes
|