shell动态生成.sql文件的方法

22 篇文章 0 订阅
4 篇文章 0 订阅
本文介绍了如何在Ubuntu22.04环境下,利用shell命令生成SQLite数据库的空.sql文件,并通过sed命令在.sql文件中插入指定内容,使其与已有内容的.sql文件保持一致。详细步骤包括生成空数据库文件、导出为.sql文件,以及通过sed的行插入操作实现内容同步。
摘要由CSDN通过智能技术生成

零、环境

1. Ubuntu 22.04(其它版本也可以)

2. sqlite3(系统自带)

一、生成空数据库文件及对应的sql文件

1. 打开终端,运行sqlite3 xxx.db(本例中为shiyan.db),生成空的数据库文件。如下所示:

$ sqlite3 shiyan.db

2. 由shiyan.db生成对应的.sql文件。如下所示:

sqlite3 shiyan.db .dump > shiyan.sql

3. 生成的shiyan.sql文件内容如下所示:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
COMMIT;

针对步骤2,有一个知识点,具体说明如下:

#############################################################################

以下内容引自:SQLite实用武器库(1)利用dump命令和read命令导出数据、导入数据_00甘道夫00的博客-CSDN博客

利用dump命令导出数据库表到文件

1. 首先,重定向sqlite输出到文件。同样不需要手动创建文件,直接给出文件名即可:

sqlite> .output test_table.sql

2. 然后,利用dump命令,将数据导出到文件。如果dump不带参数,则导出整个数据库:

sqlite> .dump test_table

3. 重定向输出回标准命令行输出:

sqlite> .output stdout

4. 查看test_table.sql文件内容:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO "test_table" VALUES(0,'name0','des0');
INSERT INTO "test_table" VALUES(1,'name1','des1');
INSERT INTO "test_table" VALUES(2,'name2','des2');
COMMIT;

#############################################################################

以上是在启动sqlite3、并在sqlite3中的操作步骤。我们这里是直接在终端下使用shell命令完成同样的功能。

二、向sql文件添加指定内容

步骤一中有2个.sql文件:一个是我们通过shell命令生成的空的shiyan.db对应的shiyan.sql;另一个是引用的知识点示例中生成的有具体内容的test_table.sql文件。那么如何在不启动sqlite3的情况下,将我们的shiyan.sql文件向test_table.sql文件靠齐,即让两者的内容一致?

这可以通过sed命令实现,具体方法如下:

1. 在shiyan.sql文件的“BEGIN TRANSACTION”一行下边插入“CREATE TABLE test_table (id integer primary key, name text, description text);”

sed -i '/BEGIN TRANSACTION;/a CREATE TABLE test_table(id integer primary key, name text, description text);' shiyan.sql

执行完以上命令后,shiyan.sql的内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
COMMIT;

可以看到,shiyan.sql已经向test_table.sql“靠近”了一步。

2. 在shiyan.sql文件的“COMMIT;”一行上边插入"INSERT INTO "test_table" VALUES(0,'name0','des0');"

sed -i '/COMMIT;/iINSERT INTO "test_table" VALUES(0,'\''name0'\'','\''des0'\'');' shiyan.sql

执行完以上命令后,shiyan.sql的内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO "test_table" VALUES(0,'name0','des0');
COMMIT;

可以看到,shiyan.sql已经向test_table.sql又“靠近”了一步。

3. 在shiyan.sql文件的第4行下边插入"INSERT INTO "test_table" VALUES(1,'name1','des1');"

sed -i '4 a INSERT INTO "test_table" VALUES(1,'\''name1'\'','\''des1'\'');' shiyan.sql

执行完以上命令后,shiyan.sql的内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO "test_table" VALUES(0,name0,des0);
INSERT INTO "test_table" VALUES(1,name1,des1);
COMMIT;

可以看到,shiyan.sql已经向test_table.sql又“靠近”了一步。

4. 在shiyan.sql文件的第6行上边插入"INSERT INTO "test_table" VALUES(12,'name12','des2');"

sed -i '6 i INSERT INTO "test_table" VALUES(2,'\''name2'\'','\''des2'\'');' shiyan.sql

执行完以上命令后,shiyan.sql的内容如下:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO "test_table" VALUES(0,'name0','des0');
INSERT INTO "test_table" VALUES(1,'name1','des1');
INSERT INTO "test_table" VALUES(2,'name2','des2');
COMMIT;

对比test_table.sql文件的内容:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test_table (id integer primary key, name text, description text);
INSERT INTO "test_table" VALUES(0,'name0','des0');
INSERT INTO "test_table" VALUES(1,'name1','des1');
INSERT INTO "test_table" VALUES(2,'name2','des2');
COMMIT;

可以看到,两者的内容完全一致了。

第二(注意是大写)步中有以下知识点:

1.  用sed来插入文本到指定行

#############################################################################

以下内容引自:

Linux 添加文本到指定行/在文件的指定行添加内容(shell, sed)_Olivia_Vang的博客-CSDN博客_shell sed -i '5 i\ f' b.txt 在指定的行插入内容 ,如果文件不存在指定的行

基本语法

  • 只是在屏幕输出/打印中显示更改,并不改变文件本身内容
sed '作用范围行 插入行前/行后 插入内容' 文件名
# 中间的空格也可省略
sed '作用范围行插入行前/行后插入内容' 文件名
# 常常在插入内容前留空格
sed '作用范围行插入行前/行后 插入内容' 文件名
  • 添加文本常常需要的是添加内容到文件里,更新文件,要在sed后面加 -i,是编辑文档“edit files in place”选项。 
sed -i '作用范围行 插入行前/行后 插入内容' 文件名

行前用 i ,行后用a
ia常用。
当然要插入内容到最后一行就得用a了。同样要插入内容到文件第一行需要用i

所以这个插入操作要注意行号的变化。下面的内容多次添加文本时注意具体写了注意的内容。

#############################################################################

2. 用sed在文件的指定位置后面添加内容

#############################################################################

以下内容引自:

shell如何在指定文件的指定位置后面添加内容_lwj103862095的博客-CSDN博客_shell在文件指定位置写入

问题说明:

想在sys_config.fex文本的某个字符串后面添加一个flag

例如:sys_config.fex里有这么一段

[nand_para]

nand_use = 1

要求在[nand_para]后面添加一个flag = 1,最后变成(不影响其他内容):

[nand_para]

flag = 1

nand_use = 1

具体实现:
 

sed -i '/\[nand_para\]/a\flag = 1' sys_config.fex

#############################################################################

3. sed中转义单引号

' 写成 '\''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝天居士

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

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

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

打赏作者

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

抵扣说明:

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

余额充值