Auto-activate for advanced_alchemy, alembic/, SQLAlchemyAsyncRepositoryService, SQLAlchemyAsyncConfig, repository_type, service_class, filters, or storage. Not for raw SQLAlchemy — use sqlspec.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for sqlspec, SQLSpec, SQLFileLoader, drivers, query builders, named SQL, filters, pagination, Arrow, framework extensions, ADK stores, or observers. Not for ORM repositories — use advanced-alchemy.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
SQLSpec is a type-safe SQL query mapper for Python -- NOT an ORM. It provides flexible connectivity with consistent interfaces across 20 database adapter packages. Write raw SQL, use the builder API, or load SQL from files. Statements pass through a sqlglot-powered AST pipeline for validation, parameter handling, and dialect conversion.
sqlspec ships first-party extensions for five web frameworks. If your project uses one of these, jump directly to the matching integration guide and skip the others:
SQLSpec, then pass that registry to SQLSpecPlugin. The plugin adds DI, the litestar db CLI, and request observability. See references/extensions.md.references/fastapi-integration.md — Depends(plugin.provide_session()) DI, Annotated[...] handlers, filter providers.references/flask-integration.md — plugin.init_app(app), pull-based plugin.get_session(), async-via-portal.references/starlette-integration.md — request.state-based session access, lifespan wrapping, middleware variants.Shared topics that apply to every framework live in references/commit-modes.md (autocommit / manual middleware) and references/multi-database.md (multi-config registry). Read the framework guide first, then those for depth.
The rest of this SKILL.md covers framework-agnostic topics: adapter setup, query builder, driver methods, filters, observability, migrations, the ADK extension, and data-dictionary introspection.
from __future__ import annotations rule — SQLSpec adapter config modules and driver definitions avoid from __future__ import annotations because configs are introspected at runtime. Consumer application modules (handlers, services, tests that use a configured driver) MAY and typically SHOULD use it — canonical Litestar apps use it in 100+ files.from sqlspec import SQLSpec
from sqlspec.adapters.asyncpg import AsyncpgConfig
config = AsyncpgConfig(
connection_config={
"dsn": "postgresql://user:pass@localhost:5432/mydb",
"min_size": 2,
"max_size": 10,
},
)
db_manager = SQLSpec()
db_manager.add_config(config)
async with db_manager.provide_session(config) as db:
users = await db.select(
"SELECT * FROM users WHERE active = $1",
True,
schema_type=User,
)
from sqlspec import sql
stmt = (
sql.select("id", "name", "email")
.from_("users")
.where_eq("status", "active")
.where("created_at > :since", since=cutoff_date)
.order_by("created_at", desc=True)
.limit(50)
.to_statement()
)
insert_stmt = (
sql.insert("users").columns("name", "email").values(name="Alice", email="alice@example.com").to_statement()
)
merge_stmt = (
sql.merge("inventory", dialect="postgres")
.using("updates")
.on("inventory.product_id = updates.product_id")
.when_matched_then_update(qty="updates.qty")
.when_not_matched_then_insert(product_id="updates.product_id", qty="updates.qty")
.to_statement()
)
| Method | Returns | Use Case |
|---|---|---|
select() / fetch() | List of rows | Filtered queries, listing |
select_value() | Single scalar | COUNT(*), MAX(), existence checks |
select_value_or_none() | Scalar or None | Optional scalar lookup |
select_one() | One row (strict) | Get-by-ID, raises NotFoundError |
select_one_or_none() | One row or None | Optional lookup |
select_with_total() | Rows plus total | Pagination |
select_stream() / fetch_stream() | Context-managed row stream | Bounded row iteration where adapter supports native streaming |
select_to_arrow() / fetch_to_arrow() | ArrowResult | Bulk data export, analytics |
select_to_storage() | StorageBridgeJob | Export query results to local or cloud storage |
execute() | SQLResult | INSERT/UPDATE/DELETE metadata |
execute_many() | SQLResult | Batch operation metadata |
execute_script() | SQLResult | Multi-statement SQL script execution |
execute_stack() | tuple[StackResult, ...] | Ordered statement-stack execution |
load_from_arrow() | StorageBridgeJob | Adapter-supported Arrow ingest |
load_from_storage() | StorageBridgeJob | Adapter-supported staged-file ingest |
load_from_records() | StorageBridgeJob | Records normalized through the Arrow ingest path |
transaction() | Context manager | Atomic transaction or savepoint scope on a driver |
arrow_result = await db.select_to_arrow(
"SELECT * FROM large_dataset WHERE region = $1",
region,
return_format="reader",
batch_size=10_000,
)
await db.load_from_arrow("users", arrow_result)
await db.load_from_records("users", [{"id": 1, "name": "Ada"}])
<workflow>
| Need | Adapter | Key Feature |
|---|---|---|
| PostgreSQL async | asyncpg, psycopg | Async, NUMERIC/PYFORMAT params, auto-probed pgvector / pg_textsearch / paradedb |
| PostgreSQL sync | psycopg | Sync+async, PYFORMAT params |
| SQLite | sqlite, aiosqlite | QMARK params, local dev |
| DuckDB analytics | duckdb | Arrow-native OLAP, extension load/install lifecycle, direct object-store transfer |
| Arrow / multi-engine ETL | adbc | Arrow-native ingest/export across DuckDB, PostgreSQL, BigQuery, Flight SQL |
| MySQL async | asyncmy | PYFORMAT params |
| Oracle | oracledb | NAMED_COLON params, sync+async |
| IBM Db2 | db2 | QMARK params, sync+async via ibm_db, SYSCAT catalog reflection |
| BigQuery / Spanner | bigquery, spanner | NAMED_AT params, cloud job/session controls |
| Raw SQL strings | Driver methods | select(), execute() |
| Dynamic queries | Query builder | sql.select()...to_statement(), sql.update()...from_(), sql.upsert() |
| SQL from files | SQLFileLoader | Metadata directives, -- param:, -- fragment:, /* include: */, /* slot: */, caching |
| High-volume ingest/export | Storage bridge | Check the adapter matrix before selecting load_from_arrow(), load_from_storage(), load_from_records(), or select_to_storage() |
dsn/url/conninfo, database/dbname, user/username normalize automatically) and pool settingsSQLSpec.add_config() and use SQLSpec.provide_session(config) or config-backed SQLSpecAsyncService(config=..., loader=...) for connection lifecycleschema_type parameter for typed results (msgspec Structs, dataclasses, or Pydantic models)LimitOffsetFilter, CursorFilter, OrderByFilter, SearchFilter, BeforeAfterFilter, or InCollectionFilterselect_stream(..., native_only=True) when bounded-memory streaming is mandatoryload_from_records(), load_from_arrow(), load_from_storage(), or select_to_storage() for high-volume data movementRun through the validation checkpoint below before considering the work complete.
</workflow> <guardrails>schema_type for query results -- get typed objects, not raw dictsasync with db_manager.provide_session(config) as db: or async with service.provide_session() as db:SQLFileLoader for static queries -- keeps SQL out of Python, supports reusable -- fragment: / /* include: */ blocks and validated /* slot: */ splicing, and reuses the global file-cache namespace-- param: declarations for named SQL files that cross service boundaries -- load-time and execute-time validation catches name drift and required parameter omissionsnative_only=True for streaming or Arrow paths only when fallback is unacceptable -- unsupported adapters otherwise use eager row conversionawait db.select("... WHERE id = $1", user_id, schema_type=User), not await db.select(..., [user_id], ...)/* slot: <name> */ fragmentsSQLSpecAsyncService(config=...)) when operations should hold a connection only for the duration of a single query or begin_transaction() block$1 for asyncpg, %s for psycopg, ? for sqlite/duckdb/db2, :name for oracledbdriver_features; Spanner request controls live in driver_features or provide_session() kwargsfrom __future__ import annotations. Consumer app modules MAY use it.Before delivering SQLSpec code, verify:
sqlspec.adapters.<name>)SQLSpec.provide_session(config) or service.provide_session() context managerschema_type for type-safe mappingLimitOffsetFilter, CursorFilter, OrderByFilter, etc.) not manual LIMIT/OFFSETextension_config={"litestar": {"disable_di": True, "manage_lifespan": True}} when SQLSpecPlugin should still manage pool lifespannative_only=True when eager fallback would be a bugload_from_arrow(), load_from_storage(), load_from_records(), or select_to_storage()adk packages; BigQuery is not an OLTP live-agent ADK backendTask: "Set up an asyncpg adapter, define a typed model, and execute a parameterized query with pagination."
from dataclasses import dataclass
from sqlspec import SQLSpec
from sqlspec.adapters.asyncpg import AsyncpgConfig
from sqlspec.core.filters import LimitOffsetFilter, OrderByFilter
@dataclass
class User:
id: int
name: str
email: str
active: bool
config = AsyncpgConfig(
connection_config={
"dsn": "postgresql://user:pass@localhost:5432/mydb",
"min_size": 2,
"max_size": 10,
},
)
db_manager = SQLSpec()
db_manager.add_config(config)
async def list_active_users(page: int = 1, page_size: int = 25) -> list[User]:
filters = [
OrderByFilter(field_name="name", sort_order="asc"),
LimitOffsetFilter(limit=page_size, offset=(page - 1) * page_size),
]
async with db_manager.provide_session(config) as db:
users = await db.select(
"SELECT id, name, email, active FROM users WHERE active = $1",
True,
*filters,
schema_type=User,
)
return users
async def get_user_count() -> int:
async with db_manager.provide_session(config) as db:
count = await db.select_value("SELECT COUNT(*) FROM users WHERE active = $1", True)
return count
</example>
Choosing between
sqlspecandadvanced-alchemy:advanced-alchemygives you an opinionated ORM service layer withUUIDAuditBase, lifecycle hooks, repository / service / Alembic integration, andOffsetPagination[T]out of the box — pick it when you want a complete CRUD surface with attribute-style row access and you're happy inside the SQLAlchemy ecosystem.sqlspecgives you direct SQL control, 20 adapter packages (asyncpg, oracledb, Db2, DuckDB, BigQuery, SQLite, and more), Arrow result paths for analytics, and a builder API when you need it — pick it when you want explicit SQL, heterogeneous database backends, or Arrow integration. Both skills integrate with Litestar via first-party plugins; see../advanced-alchemy/SKILL.mdfor the ORM path.
For detailed instructions, patterns, and API guides, refer to the following documents:
copy=False pattern.get_tables, get_columns, get_indexes), ADBC native metadata/statistics.sql factory: select, insert, update, delete, merge.select(), select_one(), select_stream(), select_to_arrow(), load methods.LimitOffsetFilter, OrderByFilter, SearchFilter.select_to_arrow() formats, Arrow-native paths, conversion fallbacks.load_from_arrow(), load_from_storage(), load_from_records(), adapter gates.SQLFileLoader with search paths, metadata directives.AsyncEventChannel, subscribe/publish patterns.sqlspec CLI, timestamp versioning, ddl_migrations tracker, extension migrations, and Litestar litestar db integration.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Auto-activate for advanced_alchemy, alembic/, SQLAlchemyAsyncRepositoryService, SQLAlchemyAsyncConfig, repository_type, service_class, filters, or storage. Not for raw SQLAlchemy — use sqlspec.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Litestar, Controller, Router, @get/@post, FromPath, MsgspecDTO, OpenAPIConfig, Provide, FromDishka, Guard, ASGIMiddleware, HTTPException, ChannelsPlugin, or WebSocket. Not for standalone libs.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Google ADK, LlmAgent, Runner, SQLSpecSessionService, google-genai, AgentRuntime, SpecTree, DynamicWorkflow, FunctionTool, or SSE agent chats. Not for offline ML training.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for litestar_autowire, AutowirePlugin, AutowireConfig, domain_packages, AutowireIntegration, AutowireLoader, or clear_autowire_cache. Not for manual Router composition — use explicit routes.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for uv build, hatch build, PyApp, PYAPP_*, wheel assets, GitHub release matrices, cargo-zigbuild, or python-build-standalone. Not for runtime deployment.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Dockerfile, compose, Railway, Cloud Run, GKE, systemd, Kubernetes, Terraform, deploy scripts, or granian/litestar run at runtime. Not for packaging artifacts.
日本語の概要は準備中です。原文の説明を表示しています。