MySQL Shell 8.4  /  ...  /  在 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

会话对象 s3 现在可以使用 session 全局对象访问,因此它表示的 X 协议连接可以从任何 MySQL Shell 模式访问:SQL 模式、JavaScript 模式和 Python 模式。现在还可以使用 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() 方法创建但没有分配给变量的,则其连接将关闭,并且如果您想再次使用它,则必须重新创建该会话对象。