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


    本文承接《shell动态生成.sql文件的方法》一文,该文链接为:https://blog.csdn.net/phmatthaus/article/details/127388057

    先来回顾一下前一篇文章中完成的事情:

    (1)建立空的sqlite数据库

    (2)dump数据库,生成相应的.dump文件;

    (3)shell下利用sed命令向.dump文件添加(插入)数据,最终完成全部信息的构建。

    但是存在一个问题,使这个方法到目前为止并不实用。之前向dump文件插入数据的脚本(举例)为:

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

    不知大家能不能发现其中的不足?

    没错,数据项中都是具体的数值。在做脚本或程序的时候一般都是使用变量来代替具体的数值,这样才能保证程序的通用性和可用性。那么应该怎样进行修改才能用变量代替具体的数值?

    有的人说我这样改:

    1. id=0
    2. name="name0"
    3. description="desc0
    4. sed -i '/COMMIT;/i INSERT INTO test_table(id, name, des) VALUES('\''${id}'\'', '\''${name}'\'', '\''${description}'\'');' shiyan.sql

    按照这个方法,实际生成的shiyan.sql内容如下:

    1. PRAGMA foreign_keys=OFF;
    2. BEGIN TRANSACTION;
    3. CREATE TABLE test_table(id integer primary key, name text, description text);
    4. INSERT INTO test_table(id, name, des) VALUES('${id}', '${name}', '${description}');
    5. COMMIT;

    可以看到,是把变量本身当成字符串写入文件了。这个方法不可行。

    那是否还有其它办法?将sql语句先单提出来用变量代替,再执行sed命令是否可行?试一下,脚本如下:

    1. id=0
    2. name="name0"
    3. description="desc0"
    4. sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
    5. #echo "sql_str is: ${sql_str}"
    6. sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql

    按照这个方法,实际生成的shiyan.sql内容如下:

    1. PRAGMA foreign_keys=OFF;
    2. BEGIN TRANSACTION;
    3. CREATE TABLE test_table(id integer primary key, name text, description text);
    4. ${sql_str}
    5. COMMIT;

    依然不行。那么应该怎么办?

    此时网上的一篇文章给出了解决方法,链接如下:

    sed引入变量的几种方法_Bibibabi_的博客-CSDN博客_linux sed变量引用

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

    sed引入变量的几种方法

    1. sed命令使用单引号的情况下,可以使用’"$var"'引用(单引号,然后双引号,变量):

    sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml

    2. sed命令中使用双引号的情况下,直接shell command或者$(shell command)引用命令执行:

    sed -i "2s/node_base/$i/"  /etc/libvirt/qemu/$i.xml

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

    按照以上文章给出的解决问题的思路,修改之前的脚本。修改后的脚本如下:

    1. id=0
    2. name="name0"
    3. description="desc0"
    4. sql_str="INSERT INTO test_table(id, name, des) VALUES(${id}, '${license}', '${name}');"
    5. #echo "sql_str is: ${sql_str}"
    6. #sed -i '/COMMIT;/i ${sql_str}' ./shiyan.sql
    7. sed -i '/COMMIT;/i '"${sql_str}"'' ./shiyan.sql

    这次生成的sql文件内容正确了,如下所示:

    1. PRAGMA foreign_keys=OFF;
    2. BEGIN TRANSACTION;
    3. CREATE TABLE test_table (id integer primary key, name text, description text);
    4. INSERT INTO test_table(id, name, des) VALUES(0,'name0','des0');
    5. COMMIT;

  • 相关阅读:
    Spark性能优化实战总结
    【高频Java面试题】简单说说JVM堆的内存结构和GC回收流程
    Nginx的概述和配置
    软件测试从入门到入职,自学规划真的很重要~
    【Java基础】注释、关键字、常量及数据类型
    如何实现应用程序的身份认证和数据加密?
    你的电脑因为出现问题而重新启动
    夺走的第一份工作竟是OpenAI CEO?
    全网最牛自动化测试框架系列之pytest(13)-多线程、多进程执行用例
    python--字符串格式化和列表
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/127404327