【sqlite】命令语法入门超详细介绍

本文详细介绍了SQLite数据库的使用,包括格式化输出、shell执行SQL文件、数据库的创建与打开、数据导出与导入以及VACUUM操作。此外,还重点讨论了'SQLiteDatabase is locked'的常见错误,解析了SQLite的并发性特点,并提供了相应的解决策略,如检查并关闭连接、重启应用以及设置锁超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、格式化

由于sqlite非常精简,所以输出没有对齐,也没有表头,我们通常会设置如下:

.mode column 	// 输出对齐
.header on		// 输出表头
.table 			// 查看表

二、shell执行sql文件

sql 命令

有时需用 shell 脚本,调用 sqlite 来执行某sql文件,可通过如下语法
假设 src.txt 中 有一行是 k1: “v1”

# /bin/bash
set -e
k=$(grep "k1" src.txt | awk -F'"' '{print $2}') # 得到值为v1的变量
sqlite3 my.db <<EOF
UPDATE tb set name = '$k';
SELECT * FROM tb;
EOF

sql 脚本

sqlite>.read a.sql

导出建表 sql

SELECT sql FROM sqlite_master WHERE type="table" AND name = "查询的表名";

三、操作

新建、打开数据库

若不存在则新建,否则打开已存在的。

bash> sqlite3 a.db # bash
sqlite> .open b.db # sqlite client

sqlite> .databases # 查看当前数据库文件路径
main: /home/testsqlite/a.db

.dump 导出

导出完整的数据库到一个文本文件中:

root@deepglint:~/testsqlite# ls
a.db  a.sql
root@deepglint:~/testsqlite# sqlite3 a.db .dump > 1.sql
root@deepglint:~/testsqlite# ll -h
total 2.1M
drwxr-xr-x  2 root root 4.0K May  4 10:33 ./
drwxr-xr-x 26 root root 4.0K May  4 10:22 ../
-rw-r--r--  1 root root 460K May  4 10:33 1.sql
-rw-r--r--  1 root root 444K May  4 10:22 a.db
-rw-r--r--  1 root root 1.2M May  4 10:17 a.sql

< 导入

将 a.sql 的内容,导入到 a.db

sqlite3 a.db < a.sql

vacuum

sqlite3 database_name "VACUUM;"

四、常见错误

4.1 SQLite database is locked

sqlite 官方文档的并发性说明如下:,详见 https://www.sqlite.org/faq.html#q5

SQLite allows multiple processes to have the database file open at once, and for multiple processes to read the database at once. When any process wants to write, it must lock the entire database file for the duration of its update. But that normally only takes a few milliseconds. Other processes just wait on the writer to finish then continue about their business.

sqlite 内部对 database file 使用了锁

  • 多个 app 可以同时打开 db 文件
  • 多个 app 可以同时 SELECT
  • 但多个 app 不能同时 WRITE:只要有人在 WRITE,sqlite 自身就会把 db 锁住,但这通常是 ms 级别的,其他 process 可以等待 WRITE 的 process 完成后再继续自己的业务。

通过如下措施可以解决:

  • Check Open Connections:检查是否有其他 open 的 connection,如果有的话,close 那些 connection。
  • Restart App:如果没有 open 的 connection,那么重启你的 app,因为 app 的逻辑可能有问题。
  • 用 sqilite3 的终端,执行 PRAGMA busy_timeout 命令,后面跟着一个表示超时的 milliseconds 值,这可以帮助 database 更优雅的处理锁,允许你在其他 process 使用的同时操作数据库。
  • 用 sqlite3 的终端,执行 PRAGMA busy_timeout 和 PRAGMA lock_timeout 设置锁的超时时间,最终锁会被自动释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值