当前位置:   article > 正文

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

sqlite .read

一、格式化

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

.mode column 	// 输出对齐
.header on		// 输出表头
.table 			// 查看表
  • 1
  • 2
  • 3

二、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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

sql 脚本

sqlite>.read a.sql
  • 1

导出建表 sql

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

三、操作

新建、打开数据库

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

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

sqlite> .databases # 查看当前数据库文件路径
main: /home/testsqlite/a.db
  • 1
  • 2
  • 3
  • 4
  • 5

.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

< 导入

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

sqlite3 a.db < a.sql
  • 1

vacuum

sqlite3 database_name "VACUUM;"
  • 1

四、常见错误

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 设置锁的超时时间,最终锁会被自动释放。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/562465
推荐阅读
相关标签
  

闽ICP备14008679号