Add a README.md file within the scripts directory detailing how to export all SAPIENS database data to a JSON file and import that JSON file into another PostgreSQL database, including usage instructions, file descriptions, export file structure, important considerations, and troubleshooting steps. Replit-Commit-Author: Agent Replit-Commit-Session-Id: aabe2db1-f078-4501-aab5-be145ebc6b9a Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/aabe2db1-f078-4501-aab5-be145ebc6b9a/TqVS1Ec
229 lines
6.1 KiB
Markdown
229 lines
6.1 KiB
Markdown
# 데이터 Export/Import 가이드
|
|
|
|
## 📋 개요
|
|
|
|
이 스크립트들은 SAPIENS 데이터베이스의 모든 데이터를 JSON 파일로 export하고, 다른 PostgreSQL 데이터베이스로 import할 수 있게 해줍니다.
|
|
|
|
## 📁 파일 설명
|
|
|
|
- **`export-data.ts`** - 현재 데이터베이스의 모든 데이터를 JSON 파일로 export
|
|
- **`import-data.ts`** - JSON 파일의 데이터를 새 PostgreSQL 데이터베이스로 import
|
|
- **`README.md`** - 이 가이드 문서
|
|
|
|
## 🚀 사용 방법
|
|
|
|
### 1. 데이터 Export (내보내기)
|
|
|
|
현재 데이터베이스의 모든 데이터를 JSON 파일로 저장합니다.
|
|
|
|
```bash
|
|
npx tsx scripts/export-data.ts
|
|
```
|
|
|
|
**결과:**
|
|
- `data-export-YYYY-MM-DD.json` 파일 생성 (예: `data-export-2025-10-13.json`)
|
|
- 모든 테이블 데이터가 JSON 형식으로 저장됨
|
|
- 진행 상황과 통계 표시
|
|
|
|
**Export되는 테이블:**
|
|
1. sessions (세션)
|
|
2. users (사용자)
|
|
3. media_outlets (미디어 매체)
|
|
4. articles (기사)
|
|
5. prediction_markets (예측 시장)
|
|
6. auctions (경매)
|
|
7. bids (입찰)
|
|
8. media_outlet_requests (매체 요청)
|
|
9. comments (댓글)
|
|
10. prediction_bets (예측 베팅)
|
|
|
|
### 2. 데이터 Import (가져오기)
|
|
|
|
Export한 JSON 파일을 새로운 PostgreSQL 데이터베이스로 가져옵니다.
|
|
|
|
#### 방법 1: 환경 변수 사용 (현재 DATABASE_URL 사용)
|
|
|
|
```bash
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json
|
|
```
|
|
|
|
#### 방법 2: 새 데이터베이스 URL 직접 지정
|
|
|
|
```bash
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://user:password@host:5432/database"
|
|
```
|
|
|
|
**예시:**
|
|
```bash
|
|
# Neon 데이터베이스로 import
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://user:pass@ep-cool-name-123.us-east-2.aws.neon.tech/neondb"
|
|
|
|
# 로컬 PostgreSQL로 import
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://postgres:password@localhost:5432/mydb"
|
|
```
|
|
|
|
## 📊 Export 파일 구조
|
|
|
|
```json
|
|
{
|
|
"exportDate": "2025-10-13T08:30:31.284Z",
|
|
"version": "1.0.0",
|
|
"tables": {
|
|
"sessions": [...],
|
|
"users": [...],
|
|
"mediaOutlets": [...],
|
|
"articles": [...],
|
|
"predictionMarkets": [...],
|
|
"auctions": [...],
|
|
"bids": [...],
|
|
"mediaOutletRequests": [...],
|
|
"comments": [...],
|
|
"predictionBets": [...]
|
|
},
|
|
"metadata": {
|
|
"totalRecords": 374,
|
|
"tableStats": {
|
|
"sessions": 1,
|
|
"users": 14,
|
|
"mediaOutlets": 77,
|
|
...
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## ⚙️ 중요 사항
|
|
|
|
### Import 전 준비사항
|
|
|
|
1. **대상 데이터베이스에 스키마가 생성되어 있어야 합니다:**
|
|
```bash
|
|
# 새 데이터베이스에서 먼저 실행
|
|
npm run db:push
|
|
```
|
|
|
|
2. **데이터베이스가 비어있거나, 중복을 허용해야 합니다:**
|
|
- Import 스크립트는 `onConflictDoNothing()` 사용
|
|
- 같은 ID의 레코드가 있으면 skip됨
|
|
|
|
3. **의존성 순서 보장:**
|
|
- 스크립트가 자동으로 테이블 간 의존성 순서대로 import
|
|
- Users → Media Outlets → Articles → ... 순서로 진행
|
|
|
|
### 데이터 안전성
|
|
|
|
- ✅ Export는 읽기 전용 (원본 데이터 변경 없음)
|
|
- ✅ Import는 `onConflictDoNothing()` 사용 (기존 데이터 보존)
|
|
- ✅ 트랜잭션 없음 (부분 import 가능)
|
|
- ✅ 진행 상황 실시간 표시
|
|
|
|
## 🔧 문제 해결
|
|
|
|
### Export 실패 시
|
|
|
|
```bash
|
|
# 데이터베이스 연결 확인
|
|
echo $DATABASE_URL
|
|
|
|
# 데이터베이스 상태 확인
|
|
npm run db:push
|
|
```
|
|
|
|
### Import 실패 시
|
|
|
|
**에러: "No database URL provided"**
|
|
```bash
|
|
# DATABASE_URL 환경 변수 설정 후 다시 시도
|
|
export DATABASE_URL="postgresql://..."
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json
|
|
```
|
|
|
|
**에러: "Table does not exist"**
|
|
```bash
|
|
# 대상 데이터베이스에 스키마 생성
|
|
npm run db:push
|
|
```
|
|
|
|
**에러: "Foreign key constraint"**
|
|
- 의존성 순서 문제 (스크립트가 자동 처리하지만, 수동 수정 시 발생 가능)
|
|
- 테이블을 순서대로 import하는지 확인
|
|
|
|
## 📝 사용 예시
|
|
|
|
### 시나리오 1: 백업 생성
|
|
|
|
```bash
|
|
# 매일 백업 생성
|
|
npx tsx scripts/export-data.ts
|
|
# 결과: data-export-2025-10-13.json
|
|
|
|
# 파일 이름 변경 (선택사항)
|
|
mv data-export-2025-10-13.json backups/backup-$(date +%Y%m%d).json
|
|
```
|
|
|
|
### 시나리오 2: 개발 → 프로덕션 데이터 이전
|
|
|
|
```bash
|
|
# 1. 개발 DB에서 export
|
|
npx tsx scripts/export-data.ts
|
|
# 결과: data-export-2025-10-13.json
|
|
|
|
# 2. 프로덕션 DB로 import
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://prod-db-url"
|
|
```
|
|
|
|
### 시나리오 3: 데이터베이스 마이그레이션
|
|
|
|
```bash
|
|
# 1. 기존 DB에서 export
|
|
DATABASE_URL="postgresql://old-db" npx tsx scripts/export-data.ts
|
|
|
|
# 2. 새 DB에 스키마 생성
|
|
DATABASE_URL="postgresql://new-db" npm run db:push
|
|
|
|
# 3. 새 DB로 데이터 import
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://new-db"
|
|
```
|
|
|
|
### 시나리오 4: 로컬 개발용 데이터 복사
|
|
|
|
```bash
|
|
# 1. 프로덕션에서 export
|
|
npx tsx scripts/export-data.ts
|
|
|
|
# 2. 로컬 DB로 import
|
|
npx tsx scripts/import-data.ts data-export-2025-10-13.json "postgresql://localhost:5432/local_dev"
|
|
```
|
|
|
|
## 🎯 체크리스트
|
|
|
|
Export 전:
|
|
- [ ] DATABASE_URL이 올바른 데이터베이스를 가리키는지 확인
|
|
- [ ] 충분한 디스크 공간 확보 (대용량 DB의 경우)
|
|
|
|
Import 전:
|
|
- [ ] 대상 데이터베이스에 스키마가 생성되어 있는지 확인 (`npm run db:push`)
|
|
- [ ] 대상 데이터베이스 URL이 정확한지 확인
|
|
- [ ] Export 파일이 손상되지 않았는지 확인
|
|
|
|
## 📞 도움말
|
|
|
|
문제가 발생하면:
|
|
1. 에러 메시지 확인
|
|
2. 데이터베이스 연결 테스트
|
|
3. 스키마가 최신인지 확인 (`npm run db:push`)
|
|
4. Export 파일 형식 검증
|
|
|
|
## 🔒 보안 주의사항
|
|
|
|
- ⚠️ Export 파일에는 **모든 사용자 데이터**가 포함됩니다
|
|
- ⚠️ **세션 데이터**와 **사용자 정보** 포함
|
|
- ⚠️ 안전한 곳에 보관하고 공유 시 주의
|
|
- ⚠️ 프로덕션 데이터는 암호화된 저장소에 보관 권장
|
|
|
|
## 📈 성능
|
|
|
|
- Export 속도: ~1,000 레코드/초
|
|
- Import 속도: ~500 레코드/초 (의존성 검사 포함)
|
|
- 100,000 레코드: ~2-3분 소요 (네트워크 속도에 따라 다름)
|