服务端2月18日 19:22
SQLite 视图怎么用,什么时候不该用?SQLite 视图是把一段 `SELECT` 查询保存成一个可复用的虚拟表。它不存储查询结果,只保存查询定义;每次查询视图时,SQLite 都会展开这段 SQL,再去读取底层表。它适合封装复杂 JOIN、统一统计口径、隐藏敏感字段,也适合给应用层一个更稳定的查询接口。但要先说清楚:普通视图不是缓存,底层查询慢,视图通常也不会变快。
```sql
CREATE VIEW user_order_summary AS
SELECT u.id, u.name, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount
FROM user...服务端2月18日 19:23
SQLite 连接池该不该用,如何避免锁和连接泄漏?SQLite 连接池要先问“该不该用”,再问“怎么实现”。SQLite 是嵌入式数据库,数据库引擎就在应用进程里,连接本质上是打开本地文件和维护一组状态,并不像 MySQL、PostgreSQL 那样要跨网络建立远程会话。连接池真正有价值的场景,是 Web 服务、多线程任务或频繁短连接脚本需要统一管理连接、事务、超时和关闭流程。它能减少连接管理混乱,但解决不了 SQLite 的单写者并发边界;连接越多,写冲突有时反而越明显。
```python
import sqlite3
from queue import Queue, Empty
class SQLitePool:
de...服务端2月18日 19:23
SQLite 预编译语句为什么更安全,参数绑定怎么用?SQLite 预编译语句的核心作用有两个:减少重复解析 SQL,以及把 SQL 结构和外部输入分开。它不是“性能优化时才用的高级技巧”,而是写数据库代码时应该默认采用的方式。只要 SQL 里有用户输入,就不要拼字符串;只要同一条 SQL 会反复执行,就应该让驱动或底层 SQLite 复用 prepared statement。这样能降低 SQL 注入风险,也能让批量写入、循环查询和日志记录更稳定。
```python
import sqlite3
conn = sqlite3.connect('app.db')
conn.execute('CREATE TABLE IF NOT EX...服务端2月18日 19:23
SQLite JSON 扩展怎么用,什么时候该拆列或建索引?SQLite JSON 扩展适合处理“结构有变化,但还没必要拆成一堆表”的数据,比如配置、埋点属性、第三方回调、用户偏好。它让 SQLite 能直接创建、校验、提取和修改 JSON,但不要因此把 SQLite 当成完整的文档数据库。更稳的设计是:原始 JSON 保留一份,稳定且高频查询的字段提成列或生成列,真正的关系和约束仍然交给普通表结构。这样既能接住变化,也不会让每次查询都在一大段文本里反复解析。
```sql
CREATE TABLE webhooks (
id INTEGER PRIMARY KEY,
payload TEXT NOT NULL CHECK (json_...服务端2月18日 19:24
SQLite 生成列该怎么用,VIRTUAL 和 STORED 如何取舍?SQLite 生成列适合把“总是由同一行其他字段推出来”的值写进表结构,比如订单总价、拼接后的姓名、从 JSON 里提取出来的状态。它不是为了少写一行查询,而是为了让计算规则固定在数据库层,避免应用服务、后台脚本、数据导出工具各算一遍还算出不同结果。使用前先问两个问题:这个值是否只依赖本行字段?这个值是否会被频繁查询、过滤或排序?如果两个答案都是“是”,生成列通常值得考虑;如果答案里出现当前时间、其他表、权限上下文或复杂业务状态,就不要勉强塞进去。
```sql
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
price NUMERI...服务端2月18日 19:24
SQLite 日期时间函数怎么用?时间存储和查询怎么避坑?SQLite 没有专门的日期时间类型,这是理解它日期函数的第一步。你可以把时间存成 TEXT、INTEGER 或 REAL,然后用 `date()`、`time()`、`datetime()`、`julianday()`、`strftime()`、`unixepoch()` 这些函数处理。
最常见、也最容易维护的做法,是把业务时间统一存成 UTC Unix 时间戳,或者存成 ISO 8601 格式的 TEXT。关键不是哪一种绝对最好,而是全项目统一。混用本地时间、UTC、字符串和秒级时间戳,后面查 bug 会非常痛苦,尤其跨设备同步时很难判断到底是谁转换错了。
## SQLite 支...服务端2月18日 19:25
SQLite 窗口函数怎么用?排名、累计和移动平均怎么写?SQLite 窗口函数适合做“保留明细行的统计”。普通 `GROUP BY` 会把多行压成一行,而窗口函数会在每一行旁边补一个计算结果。比如每个员工仍然是一行,但旁边多出部门排名、部门平均工资、累计销售额。SQLite 从 3.25.0 开始支持窗口函数。
它常用于报表、排行榜、增长率、移动平均、每组 Top N。只要你发现自己为了“既要明细又要汇总”写了很多自连接,窗口函数就值得考虑。它能把原本拆成多条 SQL 的报表逻辑收回到一条查询里,既减少应用层循环,也更容易让数据库统一排序和过滤。
## 基本语法怎么看?
窗口函数写在 `OVER (...)` 后面,里面通常有三件事:按...服务端2月18日 19:26
SQLite CTE 怎么用?递归查询和复杂 SQL 怎么写?SQLite 的 CTE,也就是公用表表达式,最直接的价值是把一段复杂查询拆成几个有名字的中间结果。它只在当前 SQL 语句里有效,不会真的创建一张持久表。SQLite 从 3.8.3 开始支持 CTE,后续版本还补充了更多优化能力。
如果一个 SQL 已经套了两三层子查询,或者你需要写递归查询,CTE 往往比继续堆括号更好读。但它不是性能灵药,有些场景会被优化器内联,有些场景可能被物化,真正上线前还是要看查询计划。尤其在移动端或嵌入式场景里,少一次无谓扫描就能少一次明显卡顿。
## 基础 CTE 怎么写?
最基本的写法是 `WITH 名称 AS (...) SELECT ...`...服务端2月18日 19:26
移动端为什么常用 SQLite?离线存储和同步怎么设计?SQLite 在移动开发里常见,是因为它刚好踩中了移动端本地数据的几个硬需求:不需要单独部署服务、文件就是数据库、离线可用、系统和生态支持成熟。iOS、Android、Flutter、React Native 都能用 SQLite,只是上层封装不同。
它适合保存用户资料、缓存列表、草稿箱、离线队列、搜索索引和少量分析数据。它不适合替代服务端数据库,也不适合在多设备之间自动解决复杂冲突。移动端用 SQLite 的关键,不是会不会 `CREATE TABLE`,而是能不能处理升级、并发、同步和数据安全。
## 表结构应该怎么设计?
移动端数据库要尽量围绕页面和同步模型设计。过度规范化会...服务端2月18日 19:27
SQLite 扩展机制怎么用?自定义函数和虚拟表怎么写?SQLite 扩展机制的核心作用,是在不改 SQLite 源码的前提下,把业务需要的函数、聚合、排序规则或虚拟表挂进数据库引擎。常见场景包括:给 SQL 增加一个字符串清洗函数、接入全文搜索或空间索引、把外部文件伪装成表查询,甚至接入加密、压缩、地理计算这类 SQLite 默认不负责的能力。
## 扩展有哪些使用方式?
SQLite 扩展主要有两种接入方式:动态加载和静态链接。动态加载适合桌面工具、内部脚本、可控的服务端环境;静态链接适合移动端、嵌入式或安全策略比较严格的应用。
动态加载通常这样写:
```sql
SELECT load_extension('/path/to/m...