MySQL Shell运行SQL的两种内置方法介绍

Posted bisal(Chen Liu)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Shell运行SQL的两种内置方法介绍相关的知识,希望对你有一定的参考价值。

mysql官方提供了很多可用的工具支持,MySQL Shell就是其中之一,借鉴杨老师的这篇文章《技术分享 | MySQL Shell 运行 SQL 的两种内置方法概述》,了解一些MySQL Shell中运行SQL的使用问题。

MySQL Shell是兼容MySQL传统命令行客户端的超级替代版,支持SQL、javascript、Python三种语言环境。工具自身包含了很多组件,使得DBA们管理MySQL更加便捷高效。

今天我们来介绍MySQL Shell的组件MYSQLX的两个检索函数在具体使用上的一些区别。

MYSQLX组件包含很多预置的类库,其中与MySQL交互最直接的就是Session类库。Session类库里又包含一系列内置函数来处理数据:其中函数run_sql和sql都可以直接和MySQL服务端交互来运行SQL语句。那到底有什么区别呢?

我们接下来具体介绍这两个。(Python 环境写法:run_sql、sql;JavaScript 环境下:runSQL、sql)

(1)函数run_sql如何使用

先连上X端口33060,替代默认语言环境为Python,变量c1即为Session对象(Session:root@localhost:33060)。

root@ytt-pc-cheap:/home/ytt# mysqlsh mysqlx:/root@localhost:33060/ytt --py
MySQL Shell 8.0.30
...
Creating an X protocol session to 'root@localhost:33060/ytt'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 9 (X protocol)
Server version: 8.0.30 MySQL Community Server - GPL
Default schema `ytt` accessible through db.
MySQL  localhost:33060+ ssl  ytt  Py > c1=db.get_session()
MySQL  localhost:33060+ ssl  ytt  Py > c1
<Session:root@localhost:33060>

执行run_sql创建表t1:run_sql可以运行任何MySQL兼容的SQL语句,

MySQL  localhost:33060+ ssl  ytt  Py > c1.run_sql("create table t1(id int auto_increment primary key, r1 int)")
Query OK, 0 rows affected (0.0656 sec)
MySQL  localhost:33060+ ssl  ytt  Py > c1.run_sql("desc t1")
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| r1    | int  | YES  |     | NULL    |                |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.0017 sec)

插入几条样例数据,

MySQL  localhost:33060+ ssl  ytt  Py > c1.run_sql("insert into t1(r1) values (10),(20),(30)")
Query OK, 3 rows affected (0.0114 sec)

Records: 3  Duplicates: 0  Warnings: 0

用run_sql来执行查询语句,

MySQL  localhost:33060+ ssl  ytt  Py > c1.run_sql("table t1")
+----+----+
| id | r1 |
+----+----+
|  1 | 10 |
|  2 | 20 |
|  3 | 30 |
+----+----+
3 rows in set (0.0008 sec)

以上都是直接运行run_sql函数的结果。

其实run_sql函数执行后会返回一个SqlResult对象,SqlResult对象包含很多函数:获取语句执行时间,一次性获取一行或者多行数据,判断是否有数据等等。既然是SqlResult ,那就是一个结果集,不支持多次获取,类似MySQL的游标。

接下来将run_sql函数执行结果赋予一个变量r1,后续操作都通过r1来进行:r1被赋予SqlResult对象,

MySQL  localhost:33060+ ssl  ytt  Py > r1=c1.run_sql("table t1")
MySQL  localhost:33060+ ssl  ytt  Py > r1.has_data()
true
MySQL  localhost:33060+ ssl  ytt  Py > r1.get_execution_time()
0.0010 sec
MySQL  localhost:33060+ ssl  ytt  Py > r1.fetch_one()
[
    1,
    10
]
MySQL  localhost:33060+ ssl  ytt  Py > r1.fetch_one()
[
    2,
    20
]
MySQL  localhost:33060+ ssl  ytt  Py > r1.fetch_one()
[
    3,
    30
]
MySQL  localhost:33060+ ssl  ytt  Py > r1.fetch_one()
MySQL  localhost:33060+ ssl  ytt  Py >

run_sql函数也可以绑定变量执行,

MySQL  localhost:33060+ ssl  ytt  Py > c1.run_sql("select * from t1 where r1 in (?,?,?)",[10,20,30])
+----+----+
| id | r1 |
+----+----+
|  1 | 10 |
|  2 | 20 |
|  3 | 30 |
+----+----+
3 rows in set (0.0004 sec)

(2)函数sql如何使用

sql函数和run_sql函数不一样,它返回的不是SqlResult对象,而是一个SqlExecute对象,是SqlResult对象产生之前的阶段。举个例子:将sql函数执行结果赋予变量r2,这样每调用一次r2,相当于重新执行一次原请求,

MySQL  localhost:33060+ ssl  ytt  Py > r2=c1.sql("table t1")
MySQL  localhost:33060+ ssl  ytt  Py > r2
+----+----+
| id | r1 |
+----+----+
|  1 | 10 |
|  2 | 20 |
|  3 | 30 |
+----+----+
3 rows in set (0.0004 sec)
MySQL  localhost:33060+ ssl  ytt  Py > r2
+----+----+
| id | r1 |
+----+----+
|  1 | 10 |
|  2 | 20 |
|  3 | 30 |
+----+----+
3 rows in set (0.0002 sec)

如果将变量r2的执行结果赋予变量r3,那r3就变成一个SqlResult对象,只支持获取一次,又回退到run_sql函数的结果,

MySQL  localhost:33060+ ssl  ytt  Py > r3=r2.execute()
MySQL  localhost:33060+ ssl  ytt  Py > r3.fetch_all()
[
    [
        1,
        10
    ],
    [
        2,
        20
    ],
    [
        3,
        30
    ]
]

MySQL  localhost:33060+ ssl  ytt  Py > r3.fetch_all()
[]      
MySQL  localhost:33060+ ssl  ytt  Py > r3
Empty set (0.0004 sec)

sql函数同样支持执行绑定变量的请求:一次绑定一个数组,

MySQL  localhost:33060+ ssl  ytt  Py > r2=c1.sql("select * from t1 where r1 in (?,?,?)")
MySQL  localhost:33060+ ssl  ytt  Py > r2.bind([10,20,30])
+----+----+
| id | r1 |
+----+----+
|  1 | 10 |
|  2 | 20 |
|  3 | 30 |
+----+----+
3 rows in set (0.0006 sec)
MySQL  localhost:33060+ ssl  ytt  Py > r2.bind([40,50,30])
+----+----+
| id | r1 |
+----+----+
|  3 | 30 |
+----+----+
1 row in set (0.0002 sec)

因此,对于函数run_sql和sql来讲,可以参考对象SqlResult和SqlExecute的差异来选择自己最合适的使用场景。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,

近期更新的文章:

MySQL的explain analyze增强功能

MySQL的审计功能实现方案

"--"注释在Oracle和MySQL下的区别

最近碰到的一些问题

1024的一个小福利

近期的热文:

"红警"游戏开源代码带给我们的震撼

文章分类和索引:

公众号1100篇文章分类和索引

以上是关于MySQL Shell运行SQL的两种内置方法介绍的主要内容,如果未能解决你的问题,请参考以下文章

python中执行shell的两种方法总结

maven的两种可运行jar打包方式。1内置依赖,2外部依赖。

phpMyAdmin拿shell的两种方法

SQL Server 批量插入数据的两种方法 - 转

链接mysql的两种方法

百万级数据的批量插入的两种方法测试