Postgresql 用于将csv文件复制到postgres数据库的Shell脚本正在将表名更改为小写并导致其失败

Postgresql 用于将csv文件复制到postgres数据库的Shell脚本正在将表名更改为小写并导致其失败,postgresql,shell,csv,Postgresql,Shell,Csv,我有一个shell脚本,可以将一堆.csv文件上传到postgres数据库 #!/bin/zsh for f in csvs/*.csv do mytable=$(basename "$f" .csv) psql -d mydb --user=ian -c "copy $mytable from '$f' delimiter ',' csv header;" done csv文件看起来像B02001.csv,B99211.csv等等,

我有一个shell脚本,可以将一堆.csv文件上传到postgres数据库

#!/bin/zsh

for f in csvs/*.csv
do
    mytable=$(basename "$f" .csv)
    psql -d mydb --user=ian -c "copy $mytable from '$f' delimiter ',' csv header;" 
done
csv文件看起来像
B02001.csv
B99211.csv
等等,表格的名称像
B02001
B99211
以匹配csv文件,但当我运行脚本时,我会得到错误

ERROR:  relation "b02001" does not exist

不知何故,
$mytable
变量必须变为小写,并导致语句失败。是什么原因造成的?

您要么需要引用名称,要么期望名称更低

从-

引用标识符也使其区分大小写,而未引用的名称总是折叠成小写。例如,PostgreSQL认为标识符FOO、FOO和“FOO”是相同的,但“FOO”和“FOO”彼此不同。(在PostgreSQL中,将不带引号的名称折叠为小写与SQL标准不兼容,SQL标准规定不带引号的名称应折叠为大写。因此,根据标准,foo应等同于“foo”而不是“foo”。如果您想编写可移植应用程序,建议您始终引用特定名称,或永远不要引用它。)

试一试


如果表名不是双引号(“B02001”),它将被折叠成小写。请参阅此处的“引用标识符也使其区分大小写,而未引用的名称总是折叠成小写。”将
$mytable
变量括在引号中会导致错误
错误:在“'B08007'”第1行或附近出现语法错误:从“csvs2/B08007.csv”分隔符中复制“B08007”,'csv head…
它必须是
“B08007”
没有嵌套的单引号。我是postgres新手,我正在从mysql迁移此数据库。我是否应该将这些表重命名为小写,以使其更简单、更常规?如
b02001
。这不是一个问题,它会让事情变得更容易。SQL标准说,不带引号的名称(标识符)将被折叠成大写,Postgres则偏离了这一点,转而使用另一个方向。。。使用-x选项运行脚本以查看中间结果。。。e、 g.
zsh-x yourscript.zsh ARGS
在$f周围加上转义引号将返回
错误:在“csvs/B99283.csv”第1行或其附近出现语法错误:从“csvs/B99283.csv”分隔符复制B99283,“csv头…”
使用-x运行它将显示
psql-d acs--user=ian-c“从”\'\''''csvs/B23025.csv'\''delimiter'\''复制B23025,“\”csv头文件;'错误:关系“b23025”不存在
当我在
$mytable
周围加上转义引号(如
\“$mytable\”
),并且出于某种原因使用
\copy
而不是
copy
时,它起作用。如果您愿意编辑您的答案,我会将其标记为正确。@ian campbell-是的-按我的意思做,而不是按我写的做抱歉
"copy \"$mytable\" from '$f' delimiter ',' csv header;"