gpt4 book ai didi

将新目录添加到 PostgreSQL 表中的 Bash 脚本

转载 作者:行者123 更新时间:2023-11-29 12:22:31 25 4
gpt4 key购买 nike

我正在尝试编写一个列出目录并创建一个 SQL 脚本来插入这些目录的脚本,问题是我只想插入新目录,这是我目前所拥有的:

#If file doesn't exist add the search path test
if [ ! -e /home/aydin/movies.sql ]
then
echo "SET SEARCH_PATH TO noti_test;" >> /home/aydin/movies.sql;
fi
cd /media/htpc/
for i in *
do
#for each directory escape any single quotes
movie=$(echo $i | sed "s:':\\\':g" )
#build sql insert string
insertString="INSERT INTO movies (movie) VALUES (E'$movie');";
#if sql string exists in file already
if grep -Fxq "$insertString" /home/aydin/movies.sql
then
#comment out string
sed -i "s/$insertString/--$insertString/g" /home/aydin/movies.sql
else
#add sql string
echo $insertString >> /home/aydin/movies.sql;
fi
done;
#execute script
psql -U "aydin.hassan" -d "aydin_1.0" -f /home/aydin/movies.sql;

它似乎与一件事不同,脚本无法识别其中包含单引号的条目,因此在没有新目录的情况下再次运行脚本时,文件如下所示:

--INSERT INTO movies (movie) VALUES (E'007, Moonraker (1979)');
--INSERT INTO movies (movie) VALUES (E'007, Octopussy (1983)');
INSERT INTO movies (movie) VALUES (E'007, On Her Majesty\'s Secret Service (1969)');

我也乐于接受关于更好的方法的建议,我的过程似乎很长且效率低下:)

最佳答案

脚本对我来说总体上看起来不错。考虑修改后的版本(未经测试):

#! /bin/bash
#If file doesn't exist add the search path test
if [ ! -e /home/aydin/movies.sql ]
then
echo 'SET search_path=noti_test;' > /home/aydin/movies.sql;
fi
cd /media/htpc/
for i in *
do
#build sql insert string - single quotes work fine inside dollar-quoting
insertString="INSERT INTO movies (movie) SELECT \$x\$$movie\$x\$
WHERE NOT EXISTS (SELECT 1 FROM movies WHERE movie = \$x\$$movie\$x\$);"

#no need for grep. SQL is self-contained.
echo $insertString >> /home/aydin/movies.sql
done

#execute script
psql -U "aydin.hassan" -d "aydin_1.0" -f /home/aydin/movies.sql;
  • 要开始一个新文件,请使用 > 而不是 >>

  • 对没有变量展开的字符串常量使用单引号'

  • 使用 PostgreSQL dollar-quoting所以你不必担心字符串中的单引号。您必须在 shell 中对 $ 字符进行转义,以删除其在 shell 中的特殊含义。
    为美元报价使用“不可能”的字符串,因此它不能出现在字符串中。如果您没有,您可以测试引号字符串,并在不太可能匹配的情况下更改它,以确保万无一失。

  • 对 INSERT 使用 SELECT .. WHERE NOT EXISTS 以自动防止重新插入已存在的条目。这可以完全防止表格中的重复条目 - 而不仅仅是在新条目中。

  • movies.movi​​e 上的索引(可能但不一定是唯一的)会加速 INSERT。

关于将新目录添加到 PostgreSQL 表中的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com