MySQL Shell 9.0  /  ...  /  在 JavaScript 和 Python 模式下编写脚本会话

4.2.3 在 JavaScript 和 Python 模式下编写脚本会话

您可以使用 JavaScript 和 Python 模式下可用的函数来创建您选择的多个会话对象的类型,并将它们分配给变量。 这些会话对象允许您建立和管理并发连接,以便在一个 MySQL Shell 实例中以多种方式使用多个 MySQL 服务器实例,或者以多种方式使用同一个实例。

mysqlxmysql JavaScript 和 Python 模块中提供了用于创建会话对象的函数。 这些模块必须在使用前导入,这在交互模式下使用 MySQL Shell 时会自动完成。 函数 mysqlx.getSession() 使用指定的连接数据打开到 MySQL 服务器实例的 X 协议连接,并返回一个 Session 对象来表示该连接。 函数 mysql.getClassicSession()mysql.getSession() 使用指定的连接数据打开到 MySQL 服务器实例的经典 MySQL 协议连接,并返回一个 ClassicSession 对象来表示该连接。 使用这些函数时,MySQL Shell 使用的连接协议内置在函数中,而不是使用单独的选项进行选择,因此您必须选择适当的函数来匹配端口的正确协议。

MySQL Shell 在 shell 全局对象中提供了 openSession() 方法,该方法可以在 JavaScript 或 Python 模式下使用。 shell.openSession() 适用于 X 协议和经典 MySQL 协议。 您可以在连接数据中指定连接协议,或者让 MySQL Shell 根据您的其他连接参数(例如协议的默认端口号)自动检测它。

所有这些函数的连接数据都可以指定为类似 URI 的连接字符串,或者指定为键值对字典。 您可以使用分配给它的变量来访问返回的会话对象。 此示例演示了如何使用 mysql.getClassicSession() 函数打开经典 MySQL 协议连接,该函数返回一个 ClassicSession 对象来表示该连接

mysql-js> var s1 = mysql.getClassicSession('user@localhost:3306', 'password');
mysql-js> s1
<ClassicSession:user@localhost:3306>

此示例演示了如何在 Python 模式下使用 shell.openSession() 打开一个 X 协议连接,该连接需要进行压缩。 返回一个 Session 对象

mysql-py> s2 = shell.open_session('mysqlx://user@localhost:33060?compression=required', 'password')
mysql-py> s2
<Session:user@localhost:33060>

您在 JavaScript 模式下使用这些函数创建的会话对象只能在 JavaScript 模式下使用,如果会话对象是在 Python 模式下创建的,情况也是如此。 您不能在 SQL 模式下创建多个会话对象。 虽然您只能在创建会话对象的模式中使用分配给它们的变量来引用它们,但是您可以在任何模式下使用 shell.setSession() 方法将您创建并分配给变量的会话对象设置为 session 全局对象。 例如

mysql-js> var s3 = mysqlx.getSession('user@localhost:33060', 'password');
mysql-js> s3
<Session:user@localhost:33060>
mysql-js> shell.setSession(s3);
<Session:user@localhost:33060>
mysql-js> session
<Session:user@localhost:33060>
mysql-js> shell.status();
 shell.status()
MySQL Shell version 8.1.0-commercial

Connection Id:                9
Current schema:
Current user:                 root@localhost
SSL:                          Cipher in use: TLS_AES_256_GCM_SHA384 TLSv1.3
Using delimiter:              ;
Server version:               8.1.0-commercial MySQL Enterprise Server - Commercial
Protocol version:             Classic 10
Client library:               8.1.0
Connection:                   localhost via TCP/IP
TCP port:                     3306
Server characterset:          utf8mb4
Schema characterset:          utf8mb4
Client characterset:          utf8mb4
Conn. characterset:           utf8mb4
Result characterset:          utf8mb4
Compression:                  Disabled
Uptime:                       9 hours 42 min 5.0000 sec

Threads: 2  Questions: 61  Slow queries: 0  Opens: 176  Flush tables: 3  Open tables: 95  Queries per second avg: 0.001

现在可以使用 session 全局对象访问会话对象 s3,因此可以从任何 MySQL Shell 模式(SQL 模式、JavaScript 模式和 Python 模式)访问它表示的 X 协议连接。 现在也可以使用 shell.status() 方法显示此连接的详细信息,该方法只显示 session 全局对象表示的连接的详细信息。 如果 MySQL Shell 实例有一个或多个打开的连接,但其中没有一个设置为 session 全局对象,则 shell.status() 方法返回 未连接

您使用 shell.setSession() 设置的会话对象将替换设置为 session 全局对象的任何现有会话对象。 如果被替换的会话对象最初是使用 mysqlxmysql 函数之一或 shell.openSession() 创建并分配给变量的,则它仍然存在,并且其连接保持打开状态。 您可以在最初创建它的 MySQL Shell 模式中继续使用此连接,并且您可以随时使用 shell.setSession() 再次将其转换为 session 全局对象。 如果被替换的会话对象是使用 shell.connect() 方法创建并分配给变量的,情况也是如此。 如果被替换的会话对象是在启动 MySQL Shell 时创建的,或者使用 \connect 命令或使用 shell.connect() 方法创建的,但没有分配给变量,则其连接将关闭,如果您想再次使用它,则必须重新创建会话对象。