MySQL Shell 8.0 官方手册【第五章:代码执行】

一、语言选择

前几篇我们知道了 MySQL Shell 支持三种语言模式,但一次只能激活使用一种,模式自己决定。

  • 如果 SQL 模式,直接发送到 MySQL 服务器执行;
  • 如果 Javascript 模式,将被作为 Javascript 代码处理;
  • 如果 Python 模式,将被作为 Python 代码处理。

在 MySQL Shell 的交互模式下运行。激活特定语言使用命令: \sql\js\py
在 MySQL Shell 的批处理模式下通过选项激活指定语言: --js--py--sql,如果未指定则默认 Javascript。

shell> mysqlsh --sql < code.sql
shell> mysqlsh < code.js
shell> mysqlsh --py < code.py

在 MySQL Shell 8.0.16 中,可在另一种语言模式中执行单个 SQL 语句,执行后模式仍处于 py 或 js 模式。

mysql-py> \sql select * from sakila.actor limit 3;

在 MySQL Shell 8.0.18 中,可在任何语言状态执行操作系统命令

mysql-py> \system echo Hello from MySQL Shell!

二、交互式代码执行

看一段 MySQL Shell 8.0.18 (早期版本略有不同)中 Javascript 模式的代码。

准备测试环境,官网下载一个 world_x 示例库,有四张表可用,其中 countryinfo 为 JSON 结构:

  • country:有关世界各国的信息。
  • city:有关这些国家/地区中某些城市的信息。
  • countrylanguage:每个国家/地区使用的语言。
  • countryinfo:有关以JSON文档表示的每个国家/地区的信息。
    MySQL Shell 8.0 官方手册【第五章:代码执行】_第1张图片
shell> wget https://downloads.mysql.com/docs/world_x-db.tar.gz
shell> tar -xf world_x-db.tar.gz
shell> cd world_x-db
shell> mysql -uroot -p <world_x-db.sql

下载好后,做一些简单的 Javascript 模式操作,获取一条 countryinfo 的信息:
MySQL Shell 8.0 官方手册【第五章:代码执行】_第2张图片
如上所示,对的调用 find() 后面是 execute() 函数。CRUD 数据库命令仅在 execute() 被调用时才在 MySQL 服务器上实际执行 。但是,当以交互方式使用 MySQL Shell 时,execute() 每当按下 Return 一条语句时都会隐式调用。然后,获取操作结果并显示在屏幕上。何时需要呼叫的规则 execute() 如下:

当以这种方式使用 MySQL Shell 时,在以下位置调用 execute() 成为可选的:

  • Collection.add()
  • Collection.find()
  • Collection.remove()
  • Collection.modify()
  • Table.insert()
  • Table.select()
  • Table.delete()
  • Table.update()

注意:world_x 示例库中,前三个在 getTables() 中获取到,countryinfo 在 getColections() 中,对前三张表可直接进行 Table 操作,对 JSON 结构表 countryinfo 需要进行 Collection 操作。
MySQL Shell 8.0 官方手册【第五章:代码执行】_第3张图片

三、代码自动补全

MySQL Shell 通过 Tab 键完成自动补全,目前支持以下对象:

  • SQL 模式下的,自动完成功能可识别当前活动模式的模式名称,表名称,列名称。
  • Javascript 和 Python 模式下,补全可识别对象成员:
    • 全局对象名称,如session, db,dba, shell,mysql, mysqlx,等。
    • 全局对象,如成员 session.connect(), dba.configureLocalInstance() 等。
    • 全局用户定义变量
    • 链接的对象属性引用,例如 shell.options.verbose。
    • 链接的 X DevAPI 方法调用,例如 col.find().where().execute().fetchOne()。
  • 默认情况下,启动补全功能。
    1. 在启动时 --no-name-cache 选项启动 mysqlsh

    2. 启动后可禁用参数 autocomplete.nameCachedevapi.dbObjectHandles 为 false

    3. 若启动时用选项 --no-name-cache 禁用,可以再将两个参数设置为 true

      mysql-js> shell.options['autocomplete.nameCache']=true
      mysql-js> shell.options['devapi.dbObjectHandles']=true
      

四、代码历史

在 MySQL Shell 中支持操作的历史功能,使用向上和向下进行访问。可以使用 Ctrl+R 向后搜索,或 Ctrl+S 向前搜索。

选项 history.maxSize 为 MySQL Shell 的最大存储条数,默认为 1000 条轮替。
在这里插入图片描述
默认历史只能保存当前会话命令,全局不可见,退出后自动删除。可通过启用 history.autoSave 选项保存会话之间的历史记录。

mysqlsh-js> \option --persist history.autoSave=1

删除历史:

mysqlsh-js> \history del 2
mysqlsh-js> \history del 2-10
mysqlsh-js> \history del 2-
mysqlsh-js> \history del -10

五、输出格式

5.1 TableMySQL Shell 8.0 官方手册【第五章:代码执行】_第4张图片

5.2 Tab SeparatedMySQL Shell 8.0 官方手册【第五章:代码执行】_第5张图片

5.3 VerticalMySQL Shell 8.0 官方手册【第五章:代码执行】_第6张图片

5.4 JSON

JSON 模式有三种,分别是优化显示、行显示、数组显示三种

5.4.1 json or json/pretty

MySQL Shell 8.0 官方手册【第五章:代码执行】_第7张图片

5.4.2 ndjson or json/raw

MySQL Shell 8.0 官方手册【第五章:代码执行】_第8张图片

5.4.3 json/array

MySQL Shell 8.0 官方手册【第五章:代码执行】_第9张图片
请选择合适的输出结构

5.5 用 mysqlsh 直接书出 JSON

shell>echo "select * from world_x.city where countrycode='AUT'" | mysqlsh --json --sql --uri root@localhost:33060
or
shell>echo "select * from world_x.city where countrycode='AUT'" | mysqlsh --json=pretty --sql --uri root@localhost:33060

MySQL Shell 8.0 官方手册【第五章:代码执行】_第10张图片

注意:提前设置好密码保存,尽量不要在命令历史中显示密码

你可能感兴趣的:(mysql)