MySQL Shell 9.0  /  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 对象时,Result 对象中包含的信息会自动显示在屏幕上。返回 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(),Result 对象会自动打印。

多行支持

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

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

例如:

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

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