如何将 bash 变量作为脚本的一部分插入到 SQLite SQL 语句中?

问题描述 投票:0回答:2

背景

我正在使用代码质量分析工具(“scc”),它循环遍历我的 Gitlab 存储库并分析其中找到的代码。该工具最初创建一个 SQLite 表,然后在每次循环期间向该 SQLite 表输出一行数据。

我试图在每次循环迭代期间将每行数据写入 SQLite 表后添加一个附加列。我想添加一个变量的内容,该变量随着每次循环迭代而变化,作为附加列的条目。

示例:

循环迭代1:

$存储库=项目1

代码质量分析输出表:

项目 文件 n代码 n评论
黄色 黄色.py 5 1

添加额外的列和行条目后:

项目 文件 n代码 n评论 httpUrlToRepo
黄色 黄色.py 5 1 项目1

循环迭代2:

$存储库=项目2

代码质量分析工具输出并添加条目到附加列后:

项目 文件 n代码 n评论 httpUrlToRepo
黄色 黄色.py 5 1 项目1
绿色 绿色.py 6 4 项目2

代码

注意:

repositories
包含通过扫描我的 Gitlab 帐户找到的存储库名称数组。

counter=1

for repository in "${repositories[@]}"; do
    echo "Running scc analysis on ${repofolder}."
    
    echo "counter: ${counter}"

        if [ "${counter}" -eq "1" ]; 
        then
          echo "Creating table and adding data to analysis.db"
          scc -f sql --sql-project ${repofolder} ./${repofolder} | sqlite3 analysis.db
          sqlite3 analysis.db 'ALTER TABLE t ADD httpUrlToRepo TEXT;'
          sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'
        else
          echo "Inserting data to analysis.db"
          scc -f sql-insert --sql-project ${repofolder} ./${repofolder} | sqlite3 analysis.db
          sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'
          fi
        fi

        rm -r $repofolder

        counter=$((counter+1))

    continue
done

逻辑如下:

  1. 在第一次循环迭代中,其中 counter=1,scc 将创建一个新表并将代码质量分析数据作为 SQLite 行输出到该表。
  2. 更新表架构以添加新行“httpUrlToRepo”。
  3. 如果“httpUrlToRepo”列为空,请将变量 $repository 的内容添加到该列。这应该只是表中单行的条目。
  4. 在随后的循环迭代中,其中 counter!=1,scc 将向包含代码质量分析数据的表添加一个新行。
  5. “httpUrlToRepo”列将在其为空的地方进行更新(在我看来,此列中唯一为空的条目是当前行,因为之前的迭代应该已插入数据)。变量 $repository 的内容将被添加到这一行。

实际结果

到目前为止我的方法的问题在于在这里的 SQL 语句中使用 $repository 变量

sqlite3 analysis.db 'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;

根据我尝试将变量插入 SQL 语句的方式,要么将字符串“${repository}”添加到列中的所有条目,要么收到解析错误。

到目前为止,我已尝试将变量插入为:

${repository}
$repository
"${repository}"
&repository
""${repository}""

问题

我的问题有两个:

  • 添加新列并插入变量内容的方法是最好的方法吗?
  • 如果是这样,我怎样才能正确地将bash变量注入到SQL语句中?
sql linux bash sqlite shell
2个回答
1
投票

您的错误是,在 bash 中,单引号 不会扩展 shell 变量,因此,例如,您必须替换:

'UPDATE t SET httpUrlToRepo="$repository" WHERE httpUrlToRepo IS NULL;'

"UPDATE t SET httpUrlToRepo=\"$repository\" WHERE httpUrlToRepo IS NULL;"

然后对所有的陈述重复此操作...


0
投票

我找到了第二个问题的答案:“如何正确地将 bash 变量注入到 SQL 语句中?”。

就我而言,我需要使用

sqlite3 analysis.db "UPDATE t SET httpUrlToRepo='"$repository"' WHERE httpUrlToRepo IS NULL;"

这将评估以下内容,其中

$repository=project1
:

sqlite3 analysis.db "UPDATE t SET httpUrlToRepo='project1' WHERE httpUrlToRepo IS NULL;"

该语句位于双引号内。单引号用于开始和结束字符串,其中双引号结束并重新打开 SQL 语句并包含变量引用。

© www.soinside.com 2019 - 2024. All rights reserved.