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 Shell运行SQL的两种内置方法介绍的主要内容,如果未能解决你的问题,请参考以下文章