diff --git a/README.ko.md b/README.ko.md index 6919847..1a51299 100644 --- a/README.ko.md +++ b/README.ko.md @@ -13,6 +13,146 @@ MariaDB/MySQL, PostgreSQL 드라이버는 **번들**되어 있고, 그 외(Oracl > **DevsLab Co., Ltd.** (주식회사 데브스랩) 제작 · https://devslab.kr · Apache-2.0 +## 빠른 시작 + +아무것도 없는 상태에서 첫 마이그레이션까지 다섯 단계. 모든 블록은 복붙하면 됩니다. + +### 1. 설치 + +```bash +jbang app install datalinq@devslab-kr/datalinq # `datalinq` 명령 생성 (jbang이 JDK도 준비해 줌) +``` + +> jbang이 없나요? [최신 릴리스](https://github.com/devslab-kr/datalinq/releases/latest)에서 `datalinq.jar` 를 받아, 이 가이드의 `datalinq` 자리에 `java -jar datalinq.jar` 를 쓰면 됩니다. **JDK 21+** 필요. + +### 2. 둘러보기 — DB 없이도 됨 + +```bash +datalinq init # application.example.yml, i18n/, branding/, 샘플 sql/ 폴더를 여기에 생성 +datalinq list # sql/ 아래에서 발견된 마이그레이션 목록 +datalinq # TUI 실행 (방향키 / 숫자키로 이동, q 또는 Esc로 종료) +``` + +### 3. 데이터베이스 연결 + +`init` 이 `application.example.yml` 을 만들어 줍니다. 복사해서 소스 하나, 타겟 하나를 채우세요: + +```bash +cp application.example.yml application.yml +``` + +```yaml +datasources: + my-source: + type: sqlserver # sqlserver | mariadb | postgresql (또는: type: custom + raw url:) + host: localhost + port: 1433 + database: SourceDb + username: sa + password: "secret" + my-target: + type: postgresql + host: localhost + port: 5432 + database: TargetDb + username: postgres + password: "secret" +defaults: + source: my-source + target: my-target +``` + +```bash +datalinq config # 해석된 설정 확인 (비밀번호는 마스킹) +``` + +> 번들되지 않은 드라이버(Oracle, H2, SQLite, ...)가 필요하면 `datalinq driver oracle` 후 그 데이터소스를 `type: custom` + JDBC `url:` 로 설정하세요. + +### 4. 첫 마이그레이션 작성 + +마이그레이션은 `sql/` 아래 폴더 하나입니다. 가장 단순한 **ETL** 은 소스 쿼리의 행을 타겟 테이블로 복사합니다. SELECT의 **컬럼 별칭이 곧 타겟 컬럼**이 되므로 INSERT문을 직접 쓰지 않습니다: + +```bash +mkdir -p sql/01_Customers +``` + +`sql/01_Customers/source.sql`: + +```sql +SELECT customer_id AS id, + full_name AS name, + created_at AS created +FROM customers +``` + +`sql/01_Customers/operation.properties`: + +```properties +type=etl +table=customers # INSERT 대상 타겟 테이블 +``` + +### 5. 실행 — 항상 dry-run 먼저 + +```bash +datalinq run 0 # DRY-RUN: 소스를 읽지만 아무것도 쓰지 않음 (타겟 트랜잭션 롤백) +datalinq run 0 --execute # 실제 실행: 단일 트랜잭션, 성공 시 커밋 / 오류 시 롤백 +``` + +또는 TUI에서: `datalinq` 실행 → 마이그레이션 선택 → Enter. `sql/` 아래에 `NN_이름` 폴더를 더 떨구면 각각 메뉴 항목이 됩니다. + +
+👉 데이터가 실제로 옮겨지는 걸 보고 싶다면? Docker로 완전 복붙 데모 — 내 DB가 없어도 됩니다. + +throwaway PostgreSQL 두 개를 띄우고, 소스를 채우고, 마이그레이션을 실행해 복사된 행을 출력합니다. (end-to-end 검증 완료) + +```bash +# 1. throwaway Postgres 두 개 (소스 5433, 타겟 5434) +docker run -d --name dl-src -p 5433:5432 -e POSTGRES_PASSWORD=demo postgres:16-alpine +docker run -d --name dl-tgt -p 5434:5432 -e POSTGRES_PASSWORD=demo postgres:16-alpine +sleep 5 + +# 2. 소스 채우기 + 빈 타겟 테이블 생성 +docker exec dl-src psql -U postgres -c "CREATE TABLE customers(customer_id int, full_name text, created_at timestamp); INSERT INTO customers VALUES (1,'Alice',now()),(2,'Bob',now());" +docker exec dl-tgt psql -U postgres -c "CREATE TABLE customers(id int primary key, name text, created timestamp);" + +# 3. 설정 + 마이그레이션 하나가 든 작업 폴더 +mkdir -p dl-demo/sql/01_Customers && cd dl-demo +cat > application.yml <<'YAML' +datasources: + my-source: + type: postgresql + host: localhost + port: 5433 + database: postgres + username: postgres + password: demo + my-target: + type: postgresql + host: localhost + port: 5434 + database: postgres + username: postgres + password: demo +defaults: + source: my-source + target: my-target +YAML +cat > sql/01_Customers/source.sql <<'SQL' +SELECT customer_id AS id, full_name AS name, created_at AS created FROM customers +SQL +printf 'type=etl\ntable=customers\n' > sql/01_Customers/operation.properties + +# 4. 실제 실행 후 타겟 확인 +datalinq run 0 --execute +docker exec dl-tgt psql -U postgres -c "SELECT * FROM customers ORDER BY id;" # -> Alice, Bob + +# 5. 정리 +cd .. && docker rm -f dl-src dl-tgt +``` + +
+ ## 마이그레이션 추가 = 폴더 떨구기 ``` diff --git a/README.md b/README.md index c5da2f9..5bc63ed 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,146 @@ one-line `driver` download away. Connections are configured by **DB type + host/ > By **DevsLab Co., Ltd.** (주식회사 데브스랩) · https://devslab.kr · Apache-2.0 +## Quick start + +From nothing to your first migration in five steps. Every block is copy-paste. + +### 1. Install + +```bash +jbang app install datalinq@devslab-kr/datalinq # creates the `datalinq` command (jbang provisions a JDK too) +``` + +> No jbang? Download `datalinq.jar` from the [latest release](https://github.com/devslab-kr/datalinq/releases/latest) and use `java -jar datalinq.jar` wherever this guide says `datalinq`. Needs **JDK 21+**. + +### 2. Look around — no database required + +```bash +datalinq init # scaffolds application.example.yml, i18n/, branding/, and a sample sql/ folder here +datalinq list # lists the migrations discovered under sql/ +datalinq # opens the TUI (arrow keys / number keys to move, q or Esc to quit) +``` + +### 3. Point it at your databases + +`init` wrote `application.example.yml`. Copy it and fill in one source and one target: + +```bash +cp application.example.yml application.yml +``` + +```yaml +datasources: + my-source: + type: sqlserver # sqlserver | mariadb | postgresql (or: type: custom + a raw url:) + host: localhost + port: 1433 + database: SourceDb + username: sa + password: "secret" + my-target: + type: postgresql + host: localhost + port: 5432 + database: TargetDb + username: postgres + password: "secret" +defaults: + source: my-source + target: my-target +``` + +```bash +datalinq config # verify it resolved (passwords are masked) +``` + +> Need a driver that isn't bundled (Oracle, H2, SQLite, ...)? Run `datalinq driver oracle`, then use `type: custom` + a JDBC `url:` for that datasource. + +### 4. Write your first migration + +A migration is just a folder under `sql/`. The simplest kind — **ETL** — copies rows from a source query into a target table. The SELECT's **column aliases become the target columns**, so you never hand-write an INSERT: + +```bash +mkdir -p sql/01_Customers +``` + +`sql/01_Customers/source.sql`: + +```sql +SELECT customer_id AS id, + full_name AS name, + created_at AS created +FROM customers +``` + +`sql/01_Customers/operation.properties`: + +```properties +type=etl +table=customers # the target table to INSERT into +``` + +### 5. Run it — dry-run first, always + +```bash +datalinq run 0 # DRY-RUN: reads the source, writes nothing (the target transaction is rolled back) +datalinq run 0 --execute # for real: one transaction, commit on success / rollback on any error +``` + +Or run it from the TUI: launch `datalinq`, pick the migration, press Enter. Drop more `NN_Name` folders under `sql/` and each becomes another menu item. + +
+👉 Want to watch it actually move data? A complete, copy-paste demo with Docker — no database of your own needed. + +Spins up two throwaway PostgreSQL databases, seeds the source, runs the migration, and prints the copied rows. (Verified end-to-end.) + +```bash +# 1. two throwaway Postgres databases (source on 5433, target on 5434) +docker run -d --name dl-src -p 5433:5432 -e POSTGRES_PASSWORD=demo postgres:16-alpine +docker run -d --name dl-tgt -p 5434:5432 -e POSTGRES_PASSWORD=demo postgres:16-alpine +sleep 5 + +# 2. seed the source; create the empty target table +docker exec dl-src psql -U postgres -c "CREATE TABLE customers(customer_id int, full_name text, created_at timestamp); INSERT INTO customers VALUES (1,'Alice',now()),(2,'Bob',now());" +docker exec dl-tgt psql -U postgres -c "CREATE TABLE customers(id int primary key, name text, created timestamp);" + +# 3. a working folder with config + one migration +mkdir -p dl-demo/sql/01_Customers && cd dl-demo +cat > application.yml <<'YAML' +datasources: + my-source: + type: postgresql + host: localhost + port: 5433 + database: postgres + username: postgres + password: demo + my-target: + type: postgresql + host: localhost + port: 5434 + database: postgres + username: postgres + password: demo +defaults: + source: my-source + target: my-target +YAML +cat > sql/01_Customers/source.sql <<'SQL' +SELECT customer_id AS id, full_name AS name, created_at AS created FROM customers +SQL +printf 'type=etl\ntable=customers\n' > sql/01_Customers/operation.properties + +# 4. run for real, then check the target +datalinq run 0 --execute +docker exec dl-tgt psql -U postgres -c "SELECT * FROM customers ORDER BY id;" # -> Alice, Bob + +# 5. clean up +cd .. && docker rm -f dl-src dl-tgt +``` + +
+ ## Add a migration = drop a folder ```