首页 > 解决方案 > 用于将 csv 文件复制到 postgres 数据库的 Shell 脚本将表名更改为小写并导致其失败

问题描述

我有一个 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.csvB99211.csv等等,并且表被命名为B02001B99211以匹配 csv 文件,但是当我运行脚本时出现错误

ERROR:  relation "b02001" does not exist

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

标签: postgresqlshellcsv

解决方案


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

postgresql 文档-

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

尝试

"copy \"$mytable\" from '$f' delimiter ',' csv header;" 

推荐阅读