【问题标题】:Find and Run an SQL Script from Command Line从命令行查找并运行 SQL 脚本
【发布时间】:2021-03-13 05:22:18
【问题描述】:

我正在学习在 linux 中使用终端。 我正在尝试从命令行查找并运行 SQL 脚本。

到目前为止,我设法从终端运行 SQL 脚本:

mysql -u username -p dbname < script.sql

并找到我想要的文件:

find /path/to/migrations/directory | sort -r | head -1

(此find 命令在路径中查找最新的sql 脚本)

但我不知道如何将它们组合起来:

mysql -u username -p dbname < find /path/to/migrations/directory | sort -r | head -1

基本上,我要做的是将find 的结果作为sql 脚本执行。 任何帮助将不胜感激,谢谢:)

【问题讨论】:

    标签: mysql bash ubuntu find


    【解决方案1】:

    从字面上理解你在这里问的问题,它会是

    find /path/to/migrations/directory | sort -r | head -1 | mysql -u username -p dbname
    

    但是,如果您要查找的 SQL 脚本不是您的目录中或目录下的第一个文件(在您的 shell 的当前整理顺序中),或者如果有 directory 的子目录,您的方法就会中断在您想要的脚本之前按排序顺序。

    如果directory下面有多个文件,但只有一个是sql文件,可以写成

    find /path/to/migrations/directory -type f -name '*.sql' -exec mysql -u username -p dbname {} \;
    

    type f 确保find 不会产生目录名称,-name 子句将选择限制为以 .sql

    结尾的名称

    不过,我还是会添加一些安全措施以避免选择不合适的 SQL 脚本。比如你可以先收集directory下面的所有SQL文件,如果总数大于1则不运行,而是在stderr上发出一条消息,说“找不到明确的sql文件”。

    【讨论】:

    • 谢谢,我的目录只包含 sql 脚本,我想选择最新的文件,感谢您的帮助:)
    • 小心,根据建议 - 作为您的代码 - 不会找到最新的文件,而是以find 定位的任何顺序的第一个文件。然后,如果您没有嵌套目录,我想知道您为什么要使用 find .....如果您不仅发布当前的解决方案(这当然很好),也许您会得到更好的答案,还要准确定义您想要实现的目标。您以前从未提及“最新”标准;如果这很重要,它会使所有答案无效,我建议您针对您的问题提出一个新的、更准确的问题。
    【解决方案2】:

    为了扩展文件命令,您需要使用 $(),因此命令将是:

    mysql -u username -p dbname < "$(find /path/to/migrations/directory | sort -r | head -1)"
    

    使用引号来处理与扩展中的空格相关的任何问题。

    【讨论】:

    • 感谢您的帮助
    • 不用担心。如果答案有用。请喜欢并接受答案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 2018-10-05
    • 2020-03-15
    • 2012-05-03
    • 2011-05-01
    • 2013-09-14
    • 2013-07-18
    相关资源
    最近更新 更多