## 数据库 SQL 操作（db 模块）

db 模块无需导入，直接使用。

### 参数绑定规则（重要）
- #{varName} 是预编译占位符，自动从当前作用域取变量值，防 SQL 注入
- ${varName} 是字符串拼接，不防注入，慎用
- db 的所有方法只接受 SQL 字符串，不接受参数 map！参数通过作用域变量传递

```magicscript
// ✅ 正确写法：先定义变量，SQL 中用 #{} 引用
var name = body.name
var status = 1
db.select('select * from user where name = #{name} and status = #{status}')

// ❌ 错误写法：传参数 map（不支持！）
// db.select('select * from user where name = #{name}', {name: 'xx'})
```

### 查询
```magicscript
// 查询列表
var list = db.select('select * from user where status = #{status}')

// 分页查询（自动从请求参数获取 page/size）
var page = db.page('select * from user order by create_time desc')

// 查询单条
var user = db.selectOne('select * from user where id = #{id}')

// 查询单个值
var count = db.selectInt('select count(*) from user')
var name = db.selectValue('select name from user where id = #{id}')
```

### 增删改
```magicscript
// 新增（返回影响行数）
db.insert('insert into user(name, age) values(#{name}, #{age})')

// 新增并返回自增主键
var newId = db.insert('insert into user(name) values(#{name})', 'id')

// 更新
db.update('update user set name = #{name} where id = #{id}')

// 删除
db.update('delete from user where id = #{id}')
```

### 多行 SQL + 参数绑定
```magicscript
return db.page("""
    select u.id, u.name, u.age, d.dept_name
    from user u
    left join department d on d.id = u.dept_id
    where u.status = 1
    order by u.create_time desc
""")
```

### 数组参数自动展开
```magicscript
var ids = [1, 2, 3]
return db.select('select * from user where id in (#{ids})')
```

### 条件片段 ?{} 语法
```magicscript
// ?{condition, sql} — 条件为真时拼接 SQL 片段
return db.select('select * from user where 1=1 ?{name, and name like concat(\'%\',#{name},\'%\')} ?{status, and status = #{status}}')
```

### 命名风格转换
```magicscript
// 数据库下划线 → 驼峰命名
return db.camel().select('select user_name, create_time from user')
// 返回 [{userName: '...', createTime: '...'}]
```