> ## Agent Instructions
>
> Base URL: https://api.anysite.io
> Authentication: send the `access-token` header. Do NOT use `Authorization: Bearer`.
> Full endpoint catalog: https://app.anysite.io/docs
# 数据库操作

对 SQLite、PostgreSQL 和 ClickHouse 进行插入、更新插入、查询和同步

## 插入数据

### 来自标准输入

```bash
# Single profile → database
anysite api /api/linkedin/user user=satyanadella -q --format jsonl | \
  anysite db insert mydb --table profiles --stdin --auto-create

# Batch results → database
anysite api /api/linkedin/user --from-file users.txt --input-key user \
  --parallel 5 -q --format jsonl | \
  anysite db insert mydb --table profiles --stdin --auto-create
```

### 来自文件

```bash
anysite db insert mydb --table profiles --file results.jsonl --auto-create
```

### 自动创建表

加上 `--auto-create` 后，CLI 会根据 JSON 数据推断出模式，并在表不存在时创建它 — 列类型是根据数据值
推断出来的。`--pk <column>` 用于在创建表时设置主键。

> 
  `--auto-create` 可以安全地重复使用 — 它只在第一次运行时创建表，之后的运行会插入到已存在的表中。

如果只想创建表而不插入数据，可以直接使用 `db create-table`（`--stdin` 读取一份 JSON 样本来推断模式，
`--dry-run` 只打印 `CREATE TABLE` SQL 而不执行）：

```bash
echo '{"id":1,"name":"test"}' | anysite db create-table mydb --table users --pk id --dry-run
```

## 更新插入（Upsert，插入或更新）

`db insert` 和 `db upsert` 共用同一套底层逻辑。`db upsert` 是 `db insert --on-conflict update`
的简写：

```bash
# db upsert: conflict columns are required, always updates on conflict
cat updates.jsonl | \
  anysite db upsert mydb --table profiles --conflict-columns id --stdin

# Equivalent via db insert, with explicit --on-conflict
cat updates.jsonl | \
  anysite db insert mydb --table profiles --stdin --auto-create \
  --on-conflict update --conflict-columns id
```

`db insert` 的 `--on-conflict` 接受 `error`（默认）、`ignore`、`replace` 或 `update`。`--batch-size`
（默认 `100`）控制每批插入发送的行数。

## 检查模式

```bash
# List tables
anysite db schema mydb

# Show columns of one table
anysite db schema mydb --table profiles
```

## 查询数据

```bash
# Query with table output (default format for db query)
anysite db query mydb --sql "SELECT name, headline FROM profiles LIMIT 10" --format table

# Export query results to CSV
anysite db query mydb --sql "SELECT * FROM profiles WHERE industry = 'Technology'" \
  --format csv --output tech_profiles.csv

# Count records
anysite db query mydb --sql "SELECT COUNT(*) FROM profiles"

# Query from a .sql file instead of --sql
anysite db query mydb --file queries/report.sql --format json
```

`--format` 接受 `json`、`jsonl`、`csv`、`table`（默认）或 `parquet`（需配合 `--output`）。

## 数据集加载

将[数据集管道](/docs/cli/datasets/overview?lang=zh)采集到的数据直接加载到数据库：

```bash
# Load all sources into database (creates tables per source)
anysite dataset load-db dataset.yaml -c mydb

# Drop existing tables and reload
anysite dataset load-db dataset.yaml -c mydb --drop-existing

# Load a specific snapshot date
anysite dataset load-db dataset.yaml -c mydb --snapshot 2026-01-15

# Auto-load during collection
anysite dataset collect dataset.yaml --load-db mydb
```

管道中的每个数据源都会成为一张单独的表，以数据源 ID 命名。单个数据源的 `db_load.key` 和
`db_load.sync`（`full` — 默认，删除已不存在的行；或 `append` — 不执行删除）用于控制增量行为，
以及父数据源与依赖数据源之间的外键关联 — 见
[Per-Source Transform & Export](/docs/cli/datasets/source-types?lang=zh#per-source-transform-export)。

## 比较两次采集快照

`dataset diff` 用于比较管道针对**同一数据源采集的两份带日期的 Parquet 快照** — 它会报告两次采集运行
之间发生的变化，不会与数据库进行比较，也不会写入数据库：

```bash
anysite dataset diff dataset.yaml --source profiles --key urn.value

# Compare specific dates instead of the two most recent snapshots
anysite dataset diff dataset.yaml --source profiles --key urn.value --from 2026-01-01 --to 2026-01-08

# Diff only specific fields
anysite dataset diff dataset.yaml --source profiles --key urn.value --fields "name,headline"
```

结果包括：
- **新增** — 存在于较新快照但不在旧快照中的记录
- **移除** — 存在于旧快照但不在较新快照中的记录
- **变更** — 两份快照中都存在但字段值不同的记录
- **未变化** — 完全相同的记录数量

要将变化真正同步到实时数据库，请使用上面的 `dataset load-db`。

## 完整的管道到数据库示例

```bash
# Step 1: Collect data
anysite dataset collect dataset.yaml

# Step 2: Load into PostgreSQL
anysite dataset load-db dataset.yaml -c pg

# Step 3: Query the results
anysite db query pg --sql "
  SELECT p.name, p.headline, e.company_name
  FROM profiles p
  JOIN employees e ON p.urn_value = e.urn_value
  LIMIT 20
" --format table

# Or do it all in one command:
anysite dataset collect dataset.yaml --load-db pg
```

## 操作参考

| 命令 | 描述 |
|---------|-------------|
| `anysite db insert <conn> --table <name> --stdin` | 从标准输入插入数据 |
| `anysite db insert <conn> --table <name> --file <path>` | 从文件插入数据 |
| `anysite db insert <conn> ... --auto-create --pk <col>` | 根据数据自动创建表 |
| `anysite db insert <conn> ... --on-conflict update --conflict-columns <cols>` | 冲突时更新插入 |
| `anysite db upsert <conn> --table <name> --conflict-columns <cols>` | 更新插入，上一行的简写形式 |
| `anysite db create-table <conn> --table <name> --stdin` | 根据推断的模式创建表，不插入数据 |
| `anysite db schema <conn>` / `--table <name>` | 列出所有表，或查看某张表的列 |
| `anysite db query <conn> --sql "..."` | 运行 SQL 查询 |
| `anysite dataset load-db <yaml> -c <conn>` | 将数据集加载到数据库 |
| `anysite dataset load-db <yaml> -c <conn> --drop-existing` | 重新加载并使用全新的表 |
| `anysite dataset load-db <yaml> -c <conn> --snapshot <date>` | 加载指定的快照 |
| `anysite dataset diff <yaml> --source <id> --key <field>` | 比较某个数据源的两次采集快照 |

## 后续步骤

  
#### LLM Analysis

    使用 AI 驱动的分类和摘要来增强您的数据
  
  
#### SQL Querying

    使用 DuckDB SQL 查询采集到的数据集
