MySQL Shell 8.4  /  MySQL Shell 代码执行  /  交互式代码执行

5.2 交互式代码执行

MySQL Shell 的默认模式提供对您在命令提示符下键入的数据库操作的交互式执行。根据当前的章节 5.1,“活动语言”,这些操作可以用 JavaScript、Python 或 SQL 编写。执行后,操作结果将显示在屏幕上。

与任何其他语言解释器一样,MySQL Shell 对语法非常严格。例如,以下 JavaScript 代码段打开与 MySQL 服务器的会话,然后读取并打印集合中的文档

var mySession = mysqlx.getSession('user:pwd@localhost');
var result = mySession.getSchema('world_x').getCollection('countryinfo').find().execute();
var record = result.fetchOne();
while(record){
  print(record);
  record = result.fetchOne();
}

如上所示,对 find() 的调用后面跟着 execute() 函数。只有在调用 execute() 时,CRUD 数据库命令才会在 MySQL 服务器上实际执行。但是,当以交互方式使用 MySQL Shell 时,每当您在语句上按下 Return 时,都会隐式调用 execute()。然后,操作结果将被获取并显示在屏幕上。您何时需要调用 execute() 的规则如下:

  • 以这种方式使用 MySQL Shell 时,对以下操作调用 execute() 变为可选:

    • Collection.add()

    • Collection.find()

    • Collection.remove()

    • Collection.modify()

    • Table.insert()

    • Table.select()

    • Table.delete()

    • Table.update()

  • 如果将对象分配给变量,则禁用自动执行。在这种情况下,必须调用 execute() 才能执行操作。

  • 当处理一行并且函数返回任何可用的 Result 对象时,结果对象中包含的信息会自动显示在屏幕上。返回结果对象的函数包括:

    • SQL 执行和 CRUD 操作(如上所列)

    • mysqlmysqlx 模块中会话对象的处理事务和删除函数: -

      • startTransaction()

      • commit()

      • rollback()

      • dropSchema()

      • dropCollection()

      • ClassicSession.runSql()

根据上述规则,在交互模式下,在 MySQL Shell 中建立会话、查询和打印集合中的文档所需的语句如下:

mysql-js> var mySession = mysqlx.getSession('user:pwd@localhost');
mysql-js> mySession.getSchema('world_x').getCollection('countryinfo').find();

不需要调用 execute(),结果对象会自动打印。

多行支持

可以在多行上指定语句。在 Python 或 JavaScript 模式下,当语句块以函数定义、if/then 语句、for 循环等开头时,会自动启用多行模式。在 SQL 模式下,当发出命令 \ 时,多行模式启动。

多行模式启动后,随后输入的语句将被缓存。

例如:

mysql-sql> \
... create procedure get_actors()
... begin
...   select first_name from sakila.actor;
... end
...
注意

当您使用带有要执行的查询的 \sql 命令在另一种语言处于活动状态时执行单个 SQL 语句时,不能使用多行模式。该命令只接受单行上的单个 SQL 查询。