除了交互式代码执行外,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,它将执行脚本的内容。
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']);