MySQL 外壳 8.0  / 第 5 章 MySQL Shell 代码执行  /  5.6 批处理代码执行

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

此示例显示如何将 SQL 代码重定向到标准输入以执行:

$> echo "show databases;" | mysqlsh --sql --uri user@192.0.2.20:33060

从 MySQL Shell 8.0.22 开始, --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 对象,您可以使用该对象绑定和执行查询并返回结果。此方法在Using SQL with Session中有所描述。然而,经典 MySQL 协议会话的 SQL 查询执行使用该 runSql()函数,该函数接受 SQL 语句及其参数,将指定的参数绑定到指定的查询中,并单步执行查询,返回结果。

如果您需要创建一个独立于用于连接 MySQL 服务器的协议的 MySQL Shell 脚本,MySQL Shellsession.runSql() 为 X 协议提供了一个函数,其工作方式与 runSql()经典 MySQL 协议会话中的函数相同。您只能在 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']);