MySQL Shell 9.0  /  MySQL Shell 代码执行  /  批处理代码执行

5.6 批处理代码执行

除了交互式代码执行,MySQL Shell 还提供从以下位置进行批处理代码执行

  • 加载用于处理的文件。

  • 包含重定向到标准输入以供执行的代码的文件。

  • 从其他来源重定向到标准输入以供执行的代码。

提示

作为文件批处理执行的替代方法,您还可以从终端控制 MySQL Shell,请参阅 第 5.8 节,“API 命令行集成”

在批处理模式下,第 5.2 节,“交互式代码执行” 中描述的所有命令逻辑都不可用,只能执行活动语言的有效代码。在处理 SQL 代码时,它使用以下逻辑逐条语句地执行:读取/处理/打印结果。在处理非 SQL 代码时,它会从输入源中完全加载并作为单元执行。使用 --interactive(或 -i)命令行选项将 MySQL Shell 配置为处理输入源,就像在交互模式下发出一样;这使得交互模式提供的所有功能都可以在批处理中使用。

注意

在这种情况下,无论源是什么,它都会逐行读取并使用交互式管道进行处理。

输入的处理基于 MySQL Shell 中选择的当前编程语言,默认为 JavaScript。您可以使用 defaultMode MySQL Shell 配置选项更改默认编程语言。扩展名为 .js.py.sql 的文件始终以相应的语言模式处理,而不管默认编程语言是什么。

此示例展示了如何从文件中加载 JavaScript 代码以进行批处理

$> mysqlsh --file code.js

此处,JavaScript 文件被重定向到标准输入以供执行

$> mysqlsh < code.js

以下示例展示了如何在 Linux 平台上将 SQL 代码重定向到标准输入以供执行

$> echo "show databases;" | mysqlsh --sql --uri [email protected]:33060
注意

要在 Windows 平台上运行此命令,您必须删除 echo 命令中字符串周围的引号。

--pym 命令行选项可用于在 Python 模式下将指定的 Python 模块作为脚本执行。该选项的工作方式与 Python 的 -m 命令行选项相同。

可执行脚本

在 Linux 上,您可以通过在脚本的第一行包含 #! 行来创建使用 MySQL Shell 运行的可执行脚本。此行应提供 MySQL Shell 的完整路径并包含 --file 选项。例如

#!/usr/local/mysql-shell/bin/mysqlsh --file
print("Hello World\n");

脚本文件必须在文件系统中标记为可执行文件。运行脚本将调用 MySQL Shell,它将执行脚本的内容。

脚本中的 SQL 执行

X 协议会话的 SQL 查询执行通常使用 sql() 函数,该函数将 SQL 语句作为字符串,并返回一个 SqlExecute 对象,您可以使用该对象绑定和执行查询并返回结果。此方法在 使用会话中的 SQL 中进行了描述。但是,经典 MySQL 协议会话的 SQL 查询执行使用 runSql() 函数,该函数采用 SQL 语句及其参数,将指定参数绑定到指定查询中,并一步执行查询,返回结果。

如果您需要创建一个独立于用于连接到 MySQL 服务器的协议的 MySQL Shell 脚本,MySQL Shell 为 X 协议提供了一个 session.runSql() 函数,它的工作方式与经典 MySQL 协议会话中的 runSql() 函数相同。您只能在 MySQL Shell 中使用此函数来代替 sql(),以便您的脚本可以使用 X 协议会话或经典 MySQL 协议会话。 Session.runSql() 返回一个 SqlResult 对象,该对象与经典 MySQL 协议函数返回的 ClassicResult 对象的规范匹配,因此结果可以用相同的方式处理。

注意

Session.runSql() 是 JavaScript 和 Python 中 MySQL Shell X DevAPI 实现独有的,不是标准 X DevAPI 的一部分。

要浏览查询结果,您可以使用 fetchOneObject() 函数,该函数适用于经典 MySQL 协议和 X 协议。此函数将下一个结果作为脚本对象返回。列名用作字典中的键(如果它们是有效的标识符,则用作对象属性),行值用作字典中的属性值。对对象所做的更新不会持久化到数据库中。

例如,MySQL Shell 脚本中的这段代码可以使用 X 协议会话或经典 MySQL 协议会话来检索和输出给定国家/地区的城市名称

var resultSet = mySession.runSql("SELECT * FROM city WHERE countrycode = ' AUT'");
var row = resultSet.fetchOneObject();
print(row['Name']);