بنقرة واحدة
sqlx
Rust sqlx 비동기 SQL 툴킷 - Pool 연결, query 매크로, 트랜잭션, 마이그레이션, Axum 연동, 에러 처리
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Rust sqlx 비동기 SQL 툴킷 - Pool 연결, query 매크로, 트랜잭션, 마이그레이션, Axum 연동, 에러 처리
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Spring Security 5.5.x + jjwt 0.10.7 레거시 JWT 인증 - WebSecurityConfigurerAdapter, OncePerRequestFilter, javax.servlet 환경
Spring Boot 3.x + Spring Security 6.x + jjwt 0.12.x 기반 모던 JWT 인증 패턴. SecurityFilterChain Bean, 람다 DSL, jakarta.servlet, Virtual Threads 적용
Unity 6 LTS 2D 모바일 게임용 uGUI 시스템 전문 스킬. Canvas/RectTransform/TextMeshPro, 모바일 UI 패턴(팝업·무한 스크롤·광고·IAP), 성능 최적화, UI Toolkit과의 선택 기준 포함.
아크라시아(akrasia, 자제력 없음) 학술 논쟁의 핵심 구도와 주요 연구자·문헌을 빠르게 파악할 수 있는 도메인 지식 스킬. 도덕윤리교육 전공 대학원생(석/박사)이 학위논문·KCI 투고·세미나 준비 시 고대–현대–한국 학계–도덕심리학 흐름을 한 번에 짚도록 구성. <example>사용자: "아리스토텔레스의 propeteia와 astheneia 구분을 인용하려는데 출처를 알려줘"</example> <example>사용자: "데이비슨이 의지박약을 어떻게 가능하다고 봤는지 핵심 논증을 정리해줘"</example> <example>사용자: "한국 도덕교육 학계에서 아크라시아 다룬 논문 있어?"</example>
아리스토텔레스 『니코마코스 윤리학』에서 akrasia(자제력없음)와 akolasia(무절제)의 5축 차이를 정밀하게 정리한 학위논문 자료 스킬. NE VII.4 1147b20-1148b14, VII.8 1150b29-1151a28, III.10-12 1117b23-1119b18 절별 분해와 표준 학자 해석(Bostock, Broadie-Rowe, Pakaluk, Hursthouse, Charles 등)을 포함. 도덕교육 적용을 위한 두 상태 차이의 함의 및 한국어 번역어 처리 권장안 제공. <example>사용자: "akrates와 akolastos를 prohairesis 측면에서 어떻게 구분해야 하나요?"</example> <example>사용자: "NE VII.4의 ἁπλῶς akrasia가 akolasia와 어떻게 갈라지는지 절별 분해해주세요"</example> <example>사용자: "Hursthouse의 연속체 모델을 도덕교육 적용 절에서 어떻게 활용할 수 있나요?"</example>
한국 위기 대응 자원(자살·자해·정신건강·여성·청소년·노인·다문화) 핫라인과 앱·챗봇 안전 가드 응답 패턴 종합. 꿈 해몽·정신건강 앱 등 자가 진단/감정 콘텐츠 도메인에서 위험 신호 포착 시 안전한 자원 안내 문구를 작성할 때 참조. <example>사용자: "꿈 해몽 앱에 위기 안내 문구를 어떻게 넣을까?"</example> <example>사용자: "한국에서 자살예방 핫라인 번호가 어떻게 바뀌었지?"</example> <example>사용자: "정신건강 챗봇 안전 가드 응답 템플릿을 짜줘"</example>
| name | sqlx |
| description | Rust sqlx 비동기 SQL 툴킷 - Pool 연결, query 매크로, 트랜잭션, 마이그레이션, Axum 연동, 에러 처리 |
소스: https://docs.rs/sqlx/latest/sqlx/ | https://github.com/launchbadge/sqlx 검증일: 2026-06-20
주의: 이 문서는 sqlx 0.8.x 기준으로 작성되었습니다. 0.9.0이 2026-05-21 릴리즈되어 있으며 Breaking Change가 다수 있으므로 공식 CHANGELOG를 반드시 확인하세요. 신규 프로젝트는 0.9 도입을 검토하되 마이그레이션 노트를 참조하세요.
sqlx 0.9로의 마이그레이션 시 주요 Breaking Change (0.8 → 0.9):
query*()계열 함수의&str파라미터가SqlSafeStr트레이트로 변경 — 기존 동적 쿼리 문자열 전달 시AssertSqlSafe(..)래핑 필요Arguments트레이트에서 lifetime 파라미터 제거- MySQL: 텍스트 컬럼 타입 추론이
Vec<u8>→String으로 변경,SET NAMES동작 변경- PostgreSQL:
PgConnectOptions::options()에 전달한 값이 자동 escape됨 — 수동 escape 제거 필요sqlx.toml설정 파일 신규 지원 (선택적)
# Cargo.toml
# sqlx 0.8.x (현재 문서 기준) — 0.9가 2026-05-21 릴리즈됨, 마이그레이션 주의사항 참조
[dependencies]
sqlx = { version = "0.8", features = ["runtime-tokio", "tls-rustls", "postgres", "chrono", "uuid", "migrate"] }
tokio = { version = "1", features = ["full"] }
dotenvy = "0.15"
anyhow = "1"
thiserror = "2"
feature 선택 기준:
| feature | 설명 |
|---|---|
runtime-tokio | tokio 런타임 사용 (필수 선택: runtime-tokio 또는 runtime-async-std) |
tls-rustls | TLS 연결 (대안: tls-native-tls) |
postgres / mysql / sqlite | 데이터베이스 드라이버 (복수 선택 가능) |
chrono | chrono::NaiveDateTime 등 타입 지원 |
uuid | uuid::Uuid 타입 지원 |
migrate | 마이그레이션 매크로 migrate!() 사용 |
주의:
runtime-*과tls-*feature는 각각 정확히 하나만 선택해야 합니다. sqlx 0.8부터 복수 선택 시 컴파일 에러 대신 런타임 패닉이 발생합니다. tls feature를 복수 선택하면tls-native-tls가 우선 적용됩니다.
# .env 파일
DATABASE_URL=postgres://user:password@localhost:5432/mydb
// main.rs에서 .env 로드
dotenvy::dotenv().ok();
let database_url = std::env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
연결 문자열 형식:
| DB | 형식 |
|---|---|
| PostgreSQL | postgres://user:pass@host:5432/dbname |
| MySQL | mysql://user:pass@host:3306/dbname |
| SQLite | sqlite://path/to/db.sqlite 또는 sqlite::memory: |
use sqlx::postgres::PgPoolOptions;
use sqlx::PgPool;
let pool = PgPoolOptions::new()
.max_connections(5)
.acquire_timeout(std::time::Duration::from_secs(3))
.connect(&database_url)
.await
.expect("Failed to create pool");
use sqlx::mysql::MySqlPoolOptions;
use sqlx::sqlite::SqlitePoolOptions;
// MySQL
let mysql_pool = MySqlPoolOptions::new()
.max_connections(5)
.connect(&database_url)
.await?;
// SQLite
let sqlite_pool = SqlitePoolOptions::new()
.max_connections(5)
.connect("sqlite://data.db")
.await?;
// feature에 따라 자동으로 적절한 드라이버 선택
let pool = sqlx::Pool::<sqlx::Postgres>::connect(&database_url).await?;
Pool 주요 옵션:
| 메서드 | 기본값 | 설명 |
|---|---|---|
max_connections() | 10 | 최대 연결 수 |
min_connections() | 0 | 최소 유지 연결 수 |
acquire_timeout() | 30초 | 연결 획득 타임아웃 |
idle_timeout() | 10분 | 유휴 연결 제거 시간 |
max_lifetime() | 30분 | 연결 최대 수명 |
query! 매크로는 컴파일 타임에 SQL 문법과 타입을 검증한다. DATABASE_URL 환경변수가 설정되어 있어야 한다.
// SELECT - 익명 레코드 반환
let rows = sqlx::query!("SELECT id, name, email FROM users WHERE active = $1", true)
.fetch_all(&pool)
.await?;
for row in rows {
println!("id: {}, name: {}", row.id, row.name);
}
#[derive(Debug)]
struct User {
id: i64,
name: String,
email: String,
}
let user = sqlx::query_as!(
User,
"SELECT id, name, email FROM users WHERE id = $1",
user_id
)
.fetch_one(&pool)
.await?;
// INSERT - returning
let user = sqlx::query_as!(
User,
"INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id, name, email",
name,
email
)
.fetch_one(&pool)
.await?;
// UPDATE
let result = sqlx::query!(
"UPDATE users SET name = $1 WHERE id = $2",
new_name,
user_id
)
.execute(&pool)
.await?;
println!("rows affected: {}", result.rows_affected());
// DELETE
sqlx::query!("DELETE FROM users WHERE id = $1", user_id)
.execute(&pool)
.await?;
| 메서드 | 반환 | 용도 |
|---|---|---|
fetch_one() | 단일 행 (없으면 에러) | 반드시 1행 존재할 때 |
fetch_optional() | Option<Row> | 0 또는 1행 |
fetch_all() | Vec<Row> | 모든 행을 메모리에 |
fetch() | Stream<Row> | 대량 데이터 스트리밍 |
execute() | PgQueryResult | INSERT/UPDATE/DELETE |
컴파일 타임 검증 없이 동적 SQL을 실행할 때:
use sqlx::{Row, FromRow};
// query() 함수 - 매크로가 아닌 런타임 버전
let row = sqlx::query("SELECT id, name FROM users WHERE id = $1")
.bind(user_id)
.fetch_one(&pool)
.await?;
let name: String = row.get("name");
// query_as() 함수 - FromRow derive 필요
#[derive(Debug, FromRow)]
struct User {
id: i64,
name: String,
}
let user = sqlx::query_as::<_, User>("SELECT id, name FROM users WHERE id = $1")
.bind(user_id)
.fetch_one(&pool)
.await?;
주의:
query!매크로는 컴파일 시 DB 연결이 필요합니다. CI 환경에서는sqlx prepare로 오프라인 모드를 사용하세요.
CI/CD 환경에서 DB 연결 없이 컴파일하려면:
# 개발 환경에서 쿼리 메타데이터 저장
cargo sqlx prepare
# .sqlx/ 디렉토리가 생성됨 -> git에 커밋
# CI에서는 SQLX_OFFLINE=true 환경변수 설정
# Cargo.toml - offline feature 추가 불필요 (0.8부터 기본 지원)
# CI 환경변수
SQLX_OFFLINE=true cargo build
let mut tx = pool.begin().await?;
sqlx::query!("INSERT INTO users (name, email) VALUES ($1, $2)", name, email)
.execute(&mut *tx)
.await?;
// 주의: lastval()은 현재 세션의 마지막 시퀀스 값을 반환한다.
// 동일 세션에서 다른 시퀀스가 먼저 사용되면 잘못된 ID를 반환할 수 있다.
// RETURNING id로 명시적으로 받아서 전달하는 방식이 더 안전하다.
sqlx::query!("INSERT INTO profiles (user_id, bio) VALUES (lastval(), $1)", bio)
.execute(&mut *tx)
.await?;
tx.commit().await?;
핵심 규칙:
tx.commit().await? 호출하지 않으면 Transaction drop 시 자동 rollback&mut *tx로 역참조하여 executor로 전달let mut tx = pool.begin().await?;
match do_something(&mut tx).await {
Ok(_) => tx.commit().await?,
Err(e) => {
tx.rollback().await?;
return Err(e);
}
}
use sqlx::{PgPool, Transaction, Postgres};
async fn create_user_with_profile(
tx: &mut Transaction<'_, Postgres>,
name: &str,
bio: &str,
) -> Result<i64, sqlx::Error> {
let user = sqlx::query_scalar!(
"INSERT INTO users (name) VALUES ($1) RETURNING id",
name
)
.fetch_one(&mut **tx)
.await?;
sqlx::query!(
"INSERT INTO profiles (user_id, bio) VALUES ($1, $2)",
user,
bio
)
.execute(&mut **tx)
.await?;
Ok(user)
}
// 호출부
let mut tx = pool.begin().await?;
let user_id = create_user_with_profile(&mut tx, "Alice", "Hello").await?;
tx.commit().await?;
# 전체 DB 드라이버 포함
cargo install sqlx-cli
# PostgreSQL만
cargo install sqlx-cli --no-default-features --features rustls,postgres
# 1. 마이그레이션 디렉토리 생성
sqlx database create # DATABASE_URL 기반으로 DB 생성
# 2. 마이그레이션 파일 생성
sqlx migrate add create_users
# -> migrations/20240101000000_create_users.sql 생성됨
# 3. SQL 작성
# migrations/20240101000000_create_users.sql
-- migrations/20240101000000_create_users.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_users_email ON users(email);
# 4. 마이그레이션 실행
sqlx migrate run
# 5. 되돌리기 (reversible 마이그레이션인 경우)
sqlx migrate revert
# reversible 마이그레이션 생성 (-r 플래그)
sqlx migrate add -r create_users
# -> migrations/20240101000000_create_users.up.sql
# -> migrations/20240101000000_create_users.down.sql
// 앱 시작 시 자동 마이그레이션 (개발 환경 권장)
sqlx::migrate!("./migrations")
.run(&pool)
.await?;
주의:
migrate!()매크로 사용 시migratefeature가 활성화되어 있어야 합니다. 프로덕션 환경에서는 CLI로 마이그레이션을 실행하는 것이 안전합니다.
상세 레퍼런스 (예제·고급 패턴·흔한 실수) →
references/REFERENCE.md