2016-12-02 62 views
-1

我想从bash中的数组创建表。我已经想出了如何让它从文本文件创建数组,但是创建表或者不起作用,或者它只使用数组中的最后一个值。我想做一些不可能的事情吗?从BASH Array创建SQLite3表

我的脚本:

readarray -t array < file.txt 
for e in "${array[@]}" 
do 
DB_PATH="" 
DB_NAME=$DB_PATH"Test.db" 
sqlite3 $DB_NAME << EOF 
DROP TABLE IF EXISTS tblA; 
CREATE TABLE tblA(A,B,C); 
INSERT INTO tblA (A,B) SELECT tblB.A,tblB.B,1 FROM tblB WHERE tblB.D="$e"; 
EOF 
done 

我也试过WHERE tblB.D="${array[@]}";

编辑,包括整个SQL代码。

+0

我在SQL专家,但如果你已经删除的表,我不相信你可以做一个'INSERT ... WHERE',因为如果你丢掉了桌子,什么都没有。完全可能无法使用WHERE和INSERT。 –

+0

@MarkSetchell旧表被删除,然后使用新的数组值重新创建。 WHERE语句在INSERT中工作,而不是在这种情况下。如果我调用数组中的每个值,特别是WHERE tblB.D =“$ {array [0]}”或WHERE tblB.D =“$ {array [1]}”等,它将起作用;然而,当数组中有超过100个值时,我宁愿不必特别叫出它们。 – taylorbuckeye

+0

也许显示您的完整代码,以便我能理解... –

回答

1

问题在于,在每次循环迭代中表格都会被重新创建(即清空)。

仅创建表格一次。在循环内部,只执行INSERT。

+0

呃!我知道这将是简单的,需要修复/添加,但我没有想到它会在SQLite脚本中!谢谢!我仍然遇到了脚本的问题,但这肯定有帮助。 – taylorbuckeye

1

虽然主键继续递增,而不是重新开始(一个小问题),这个脚本工作:

sqlite3 Test.db "DELETE FROM tblA;" 

getArray() { 
    array=() 
    while IFS= read -r line 
    do 
     array+=("$line") 
    done < "$1" 
    } 

getArray "file.txt" 

for e in "${array[@]}" 
do 
    DB_PATH="" 
    DB_NAME=$DB_PATH"Test.db" 
    sqlite3 $DB_NAME << EOF 
    INSERT INTO tblA (A,B) SELECT tblB.A,tblB.B,1 FROM tblB WHERE tblB.D="$e"; 

EOF 

done 
+0

现在我只需要弄清楚如何添加一个计数器.... – taylorbuckeye

+0

把“sqlite3 Test.db”DROP TABLE ....“和sqlite3 Test.db”CREATE TABLE ....“放在”getArray“修复了主键增量“问题”并且插入仍然正常工作。 – taylorbuckeye