我必须从一些文件中读取数据并将数据插入数据库中的不同表中。Unix shell 脚本是否强大到足以胜任这项工作?
在 shell 脚本中完成这项工作是否容易,还是我应该在 Java 中完成这项工作?
如果您尝试导入的数据采用合理的格式(例如,逗号分隔)并且您的数据库服务器具有合理的命令行实用程序,那么这应该没有问题。MySQL 有“mysqlimport”命令行工具,可以接受描述文件格式的各种参数:
mysqlimport \
--fields-terminated-by=, \
--ignore-lines=1 \
--fields-optionally-enclosed-by='"' < datafile.txt
通过 perl/sed/awk 单行程序传递数据有助于以正确的格式获取数据,并且 shell 脚本可以轻松处理提示文件名、处理参数等。
使用 Unix 提供的各种命令行工具是 bash 脚本的重点。Perl、mysql 等都是该工具包的一部分。
有可能:使用您的 unix shell 脚本,生成一个 sql 脚本并使用 cli 到数据库来执行 sql 脚本。
如果信息量足够小,您可以在内存中构建 SQL,但我建议您不要这样做,因为您永远不知道未来会发生什么(而且它可能是非常大量的数据)。每个请求使用一个调用不允许您从有时可用的批量操作中受益。
你可以,但它可能有点难看,例如,如果你使用 mysql 并假设你有一个 SQL 字符串存储在 $sql
echo $sql | mysql -u[user] -p[password] -h[host]
ps 告诉我们您使用的是什么数据库可能是个好主意,这样我们可以提供更具体的帮助:p
编辑:更改了示例行,使其实际工作
当然可以,前提是您手边有一个命令行 SQL 客户端!我已经用 Sybase 和 isql 命令行客户端完成了它。您甚至可以变得聪明并通过 awk 发送内容并发送脚本以即时生成命令。这可能不是做所有事情的最有效方式,但有很多机会来发挥你的 Unix 黑客魔力。
管道是你的朋友。
例如,在 MySQL 中:
echo 'load data infile /path/to/the/file into table table_name ...' |
mysql -u mysql_user_id -p
应该做的工作。
如果您的文件以某种方式结构化,例如逗号/制表符分隔等。
有关详细信息,请查看您的数据库的手册。
现在无法测试,但类似:
echo "INSERT INTO foo (b,a,r) VALUES (1,2,3);" |
mysql -u user -psecret -h host database
在 shell 脚本中应该可以工作。虽然不知道如何从中获取数据
这取决于您的数据库管理系统。他们中的大多数都有强大的 shell 工具来导入数据,甚至执行一些 ETL 功能。如果这些工具支持批量加载,它们甚至可能非常高效——通常 Java JDBC 不能那么容易地做到这一点。
Shell 脚本(Bash 或类似)的主要目的不是处理数据库。选择 Java 甚至更好,利用这个机会学习 Python 或 Ruby 等脚本语言的基础知识。