postgresql - 用于将 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.csv
,B99211.csv
等等,并且表被命名为B02001
,B99211
以匹配 csv 文件,但是当我运行脚本时出现错误
ERROR: relation "b02001" does not exist
不知何故,$mytable
变量必须变成小写并导致语句失败。是什么原因造成的?
解决方案
您要么需要引用名称,要么期望它更低。
引用标识符也使其区分大小写,而未引用的名称总是折叠为小写。例如,标识符 FOO、foo 和“foo”在 PostgreSQL 中被认为是相同的,但“Foo”和“FOO”与这三个不同并且彼此不同。(在 PostgreSQL 中将不带引号的名称折叠为小写与 SQL 标准不兼容,SQL 标准说不带引号的名称应折叠为大写。因此,根据标准, foo 应该等效于 "FOO" 而不是 "foo"。如果您想编写可移植的应用程序,建议您始终引用特定名称或永远不要引用它。)
尝试
"copy \"$mytable\" from '$f' delimiter ',' csv header;"
推荐阅读
- encryption - 在 mule 中使用多个密钥的 PGP 加密
- javascript - 更改表单 ID 并使用按钮提交事件触发旧提交 ID
- c# - 预计读取 4 个标头字节,但仅收到 0
- c# - 在调用 ShowDialog 之前进行验证
- google-sheets - 将活动单元格的行号存储在变量中,切换到另一张表,将存储的数字放入单元格 I3,结束宏
- python - 如何在 OSX 上卸载所有 Python 2.7 包(不卸载 Python)?
- html - HTML5 视频标签是否有“异步”模式?
- python - Python:针对浮点数和字符串的输入验证
- python - Dockerized Django 应用程序拒绝连接
- python - 如何将列表中的元素用作 range() 中的参数?