MySQL Shell 8.4  /  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']);