Please enable Javascript to view the contents

MySQL 高级客户端工具 MySQL Shell(简称 mysqlsh) 之 X DevAPI

 ·  🕒 3 分钟  ·  ✍️ 加文 · 👀... 阅读

MySQL X DevAPI 引入了一种全新、现代且易于学习的数据处理方式,使您能够处理关系数据和文档数据。由支持 X 协议的 MySQL ShellMySQL Connectors 实现

  • X DevAPI 会话是一个高级数据库 Session 概念,不同于传统的低级 MySQL 连接会话。新的高级 Session 概念使您能够编写可以透明地从单个 MySQL 服务器扩展到多服务器环境的代码
  • 应用程序可以与运行 X 插件的 MySQL 服务器实例建立逻辑会话。会话由 mysqlx 工厂生产,返回的会话可以封装对一个或多个运行 X Plugin 的 MySQL 服务器实例的访问
  • 使用 X 协议时,Session 可以封装一个或多个实际的 MySQL 连接。使用这种更高的抽象级别将物理 MySQL 设置与应用程序代码分离。该 Session 提供对 X DevAPI 的完全支持和对 SQL 的有限支持

关系表与 JSON 文档对比

概念 关系表 JSON 文档
数据库 database Schema
Table Collection
Row Document
Column Field

安装 MySQL Shell

1、安装 mysql shell 并连接到 mysql 服务器,及其提供的命令行操作模式(js,sql,py)切换

# yum 方式安装
yum install mysql-shell\*8.0.30

# 可选,二进制解压安装
wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz
tar xzf mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz && cd mysql-shell-8.0.30-linux-glibc2.12-x86-64bit/
bin/mysqlsh --help

# 通过 mysqlsh 连接至 mysql 服务器 192.168.31.11
[root@dev ~]# mysqlsh
MySQL  JS >\c 192.168.31.11
#> Creating a session to 'root@192.168.31.11'
#> Please provide the password for 'root@192.168.31.11': ****
#> Save password for 'root@192.168.31.11'? [Y]es/[N]o/Ne[v]er (default No): y
#> Fetching schema names for autocompletion... Press ^C to stop.
#> Your MySQL connection id is 14 (X protocol)
#> Server version: 8.0.30 MySQL Community Server - GPL
#> No default schema selected; type \use <schema> to set one.

# 切换 mysql shell 操作模式
MySQL  localhost  SQL > \js
#> Switching to JavaScript mode...
MySQL  localhost  JS > \sql
#> Switching to SQL mode... Commands end with ;
MySQL  localhost  JS > \py
#> Switching to Python mode...

# dev api
MySQL  localhost  JS > \help devapi
MySQL  localhost  JS > \help mysqlx

# admin api
MySQL  localhost  JS > \help adminapi
MySQL  localhost  JS > \help dba

管理 Tables

可以使用X DevAPI来管理 MySQL 关系数据

JavaScript 模式

// javascript 模式下,连接 MySQL,创建数据库 demo,创建表 user
var mysqlx = require('mysqlx');
var session = mysqlx.getSession( { host: '192.168.31.11', port: 33060, user: 'root', password: 'root'} );
var db = session.createSchema('demo');   // 切换 session.getSchema('demo');
session.sql("use demo")
session.sql("create table user(id int,name varchar(16),age int)")
session.sql("show tables");

var user = db.getTable('user')  // 获取数据表对象 user
// 可以使用 insert() 方法和 values() 方法将记录插入到现有的关系表
user.insert("id", "name", "age").values(1, "colin01", 32)
user.insert("id", "name", "age").values(2, "colin02", 32)
user.delete().where("name = 'colin01'")
user.update().set("name", "colin03").where("name = 'colin01'")

user.select()
user.select(["name", "age"])
user.select(["name", "age"]).where("name like 'colin%'")
user.select(["name", "age"]).where("name like 'colin%' and age = 22")

Python 模式

连接 mysql 数据库,创建 session,选择要操作的数据库

// python 模式下,连接 MySQL,创建数据库 demo,创建表 user
from mysqlsh import mysqlx
session = mysqlx.get_session( { 'host': '192.168.31.11', 'port': 33060, 'user': 'root', 'password': 'root' } )
db = session.create_Schema('demo');     // 若使用现有数据库,则使用 session.get_schema('demo');
session.sql("use demo")
session.sql("create table user(id int,name varchar(16),age int)")
session.sql("show tables");

user = db.get_table('user');     // 获取数据表对象 user
// 可以使用 insert() 方法和 values() 方法将记录插入到现有的关系表
user.insert("id", "name", "age").values(1, "colin01", 32)
user.insert("id", "name", "age").values(2, "colin02", 32)
user.delete().where("name = 'colin01'")
user.update().set("name", "colin03").where("name = 'colin01'")

user.select()
user.select(["name", "age"])
user.select(["name", "age"]).where("name like 'colin%'")
user.select(["name", "age"]).where("name like 'colin%' and age = 22")

MySQL  localhost:33060+ ssl  Py > db
// <Schema:demo>
MySQL  localhost:33060+ ssl  Py > session
// <Session:root@192.168.31.11:33060>
MySQL  localhost:33060+ ssl  Py > user
// <Table:user>

管理 Documents

可以使用X DevAPI来管理 MySQL 文档数据

JavaScript 模式

1、操作 mysql 文档(Documents)

该操作模式下创建数据库(Schema)、集合(Collection)、添加文档(Document)演示
mysql client 到 mysql server 的连接协议有: 经典的 MySQL 协议(工作端口 3306) 和 X 协议(工作端口 33060)

// 连接到 mysql 并创建数据库 demo01
var mysqlx = require('mysqlx');
var session = mysqlx.getSession( { host: 'localhost', port: 33060, user: 'root', password: 'root'} );
var db = session.createSchema('demo01');

// Create a new collection 'user' and Insert JSON data directly
var coll = db.createCollection('user');
coll.add({_id: '1', name: 'colin01', age: 21}).execute();
coll.add([ {_id: '2', name: 'colin02', age: 24}, {_id: '3', name: 'colin03', age: 39} ]).execute();

// 打印集合文档
coll.find()
coll.find('name like :param1 AND age < :param2').limit(1).bind('param1', 'colin%').bind('param2', 22).execute();

// 删除集合
db.dropCollection('user');
session.close()

session.getSchemas();

// 执行 db 查看当前操作的数据库或 schema,执行 session 、coll 时同理;该规则同样适用于 py 模式

Python 模式

1、操作文档存储

from mysqlsh import mysqlx

# 连接到 mysql 并创建数据库 demo02
session = mysqlx.get_session( { 'host': '192.168.31.11', 'port': 33060, 'user': 'root', 'password': 'root' } )
db = session.create_schema('demo02');

# 创建集合 user
coll = db.create_collection('user')
coll.add({ '_id': '1', 'name': 'colin01', 'age': 21 }).execute();
coll.add([ {'_id': '2', 'name': 'colin02', 'age': 24}, {'_id': '3', 'name': 'colin03', 'age': 39} ]).execute();

# 打印集合文档
coll.find()
coll.find('name like :param1 AND age < :param2').limit(1).bind('param1', 'colin%').bind('param2', 22).execute();

session.close()

session.get_Schemas();

参考

X DevAPI User Guide

python 模式下 X DevAPI 用户指南
javascript 模式下 X DevAPI 用户指南

为 MySQL 8.0 中引入的 X DevAPI 协议提供了一个客户端库,该协议支持关系表JSON 文档,从而可以同时使用表 和 集合
Connector/Python


加文
作者: 加文
运维工程师
版权声明:自由转载-非商用-非衍生-转载请注明出处!


目录