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 = f"{environment}-shops"
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=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 main():
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  """
229
- メイン実行関数
230
- 使用例:
231
- - ドライラン: python migrate_kids_available_type.py
232
- - 実際の実行: python migrate_kids_available_type.py --execute
233
  """
234
- import sys
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
- main()
 
 
 
 
 
 
 
 
 
 
 
 
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