网易首页 > 网易号 > 正文 申请入驻

MySQL SHELL 操作关系表指南-爱可生

0
分享至

关键字:MySQL数据库容灾方案、MySQL数据库数据备份、MySQL数据库压缩

前言

我之前有一篇介绍在 MySQL SHELL 环境中如何对文档类数据进行操作的文章(MySQL 在NOSQL 领域冲锋陷阵),但是 MySQL SHELL 功能很多,除了可以操作文档类数据,也可以对关系表进行各种 DDL,DML 等操作。这里我就用几个简单例子来示范下如何用 MySQL SHELL 操作关系表。

此处引用的数据库示例基于官方的 SAMPLE DATABASE:WORLD,表结构以及数据可以自行下载。

MySQL SHELL 对关系型数据库的操作涉及到三个组件:

  1. MySQL:传统 mysql,操作比较简单,除了写法有些差异外,基本上等同于 SQL 操作。
  2. MySQL X:基于 X DEV 协议操作 mysql,其中包含很多类,除了可以操作文档数据,也可以操作关系表。
  3. SHELL:包含了以上两个组件,可以随意切换,重点在于如何选择连接协议。

我们来依次看看各个组件对关系表的常用检索方式。

一、mysql 组件

连接数据库:mysql.get_session 或者 mysql.get_classic_session

可以用如下传统拼串方式连接数据库:

MySQL Py > connection_url="mysql://root:root@localhost/world?socket=(/var/lib/mysql/official/mysql.sock)"MySQL Py > ytt_cn1 = mysql.get_session(connection_url);MySQL Py > ytt_cn1

也可以用字典的方式连接数据库:

MySQL Py > connection_url={"schema":"world","user":"root","password":"root","socket":"/var/lib/mysql/official/mysql.sock"}MySQL Py > ytt_cn1=mysql.get_session(connection_url);MySQL Py > ytt_cn1

接下来可以用 ClassicSession 类提供的各种方法对关系表进行相关操作,所有的操作都可以直接用函数 run_sql 来执行:

对表 city 查询:

MySQL Py > ytt_cn1.run_sql("table city limit 1")+----+-------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+----+-------+-------------+----------+------------+| 1 | Kabul | AFG | Kabol | 1780000 |+----+-------+-------------+----------+------------+1 row in set (0.0005 sec)

对表 city 插入:

MySQL Py > ytt_cn1.run_sql("insert into city(name,countrycode,population,district) values ('test','CHN',1000000,'dd')")Query OK, 1 row affected (0.0079 sec)MySQL Py > ytt_cn1.run_sql("select * from city where name ='test'")+------+------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+------+------+-------------+----------+------------+| 4097 | test | CHN | dd | 1000000 |+------+------+-------------+----------+------------+1 row in set (0.0032 sec)

对表 city 更新:

MySQL Py > ytt_cn1.run_sql("update city set name='who know ?' where id=4097")Query OK, 1 row affected (0.0894 sec)Rows matched: 1 Changed: 1 Warnings: 0MySQL Py > ytt_cn1.run_sql("select * from city where id=4097")+------+------------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+------+------------+-------------+----------+------------+| 4097 | who know ? | CHN | dd | 1000000 |+------+------------+-------------+----------+------------+1 row in set (0.0005 sec)

对表 city 删除:

MySQL Py > ytt_cn1.run_sql("delete from city where id=4097")Query OK, 1 row affected (0.0739 sec)MySQL Py > ytt_cn1.run_sql("select * from city where id=4097")Empty set (0.0004 sec)

开启一个事务块:

MySQL Py > ytt_cn1.start_transaction();Query OK, 0 rows affected (0.0003 sec)MySQL Py > ytt_cn1.run_sql("delete from city where id =1")Query OK, 1 row affected (0.0006 sec)MySQL Py > ytt_cn1.rollback();Query OK, 0 rows affected (0.2070 sec)MySQL Py > ytt_cn1.run_sql("select * from city where id = 1")+----+-------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+----+-------+-------------+----------+------------+| 1 | Kabul | AFG | Kabol | 1780000 |+----+-------+-------------+----------+------------+1 row in set (0.0004 sec)

关闭连接:

MySQL Py > ytt_cn1.close();MySQL Py > ytt_cn1

二、mysqlx 组件

MySQL X 组件包含了很多类,下面我来举几个常用的例子:

依然是先连接数据库 world:X 协议端口 33060 或者 X SOCKET(用 mysqlx.get_session 方法)。

MySQL Py > connection_urlx="mysqlx://root:root@localhost/world?socket=(/var/lib/mysql/official/mysqlx.sock)"MySQL Py > ytt_cnx1=mysqlx.get_session(connection_urlx);

比如找出人口小于800的城市并且列出对应的国家名字:

SQL: select a.id,a.name,b.name country_name, a.population from city a join country b on (a.countrycode = b.code and a.population < 800);

2.1 SQLRESULT 类:类似于 mysql 游标用法

MySQL Py > sql1="select a.id,a.name,b.name country_name, a.population from city a join country b on (a.countrycode = b.code and a.population < 800)"MySQL Py > sql_result1=ytt_cnx1.run_sql(sql1)

获取前两行:默认不带字段名

MySQL Py > sql_result1.fetch_one()[ 62, "The Valley", "Anguilla", 595]MySQL Py > sql_result1.fetch_one()[ 1791, "Flying Fish Cove", "Christmas Island", 700]

获取带字段名的记录:

MySQL Py > sql_result1.fetch_one_object();{ "country_name": "Cocos (Keeling) Islands", "id": 2316, "name": "Bantam", "population": 503}

一次性获取剩余的行:

MySQL Py > sql_result1.fetch_all()[ [ 2317, "West Island", "Cocos (Keeling) Islands", 167 ], [ 2728, "Yaren", "Nauru", 559 ], [ 2805, "Alofi", "Niue", 682 ], [ 2912, "Adamstown", "Pitcairn", 42 ], [ 3333, "Fakaofo", "Tokelau", 300 ], [ 3538, "Città del Vaticano", "Holy See (Vatican City State)", 455 ]]

2.2 SqlExecute 类:类似于 prepare 语句用法

比如把之前的人口判断条件替换为绑定变量(?或者变量(:a)),这样可以方便多个条件一起查询。

MySQL Py > sql2="select a.id,a.name,b.name country_name, a.population from city a join country b on (a.countrycode = b.code and a.population < ?)" MySQL Py > sql_result2=ytt_cnx1.sql(sql2);

给定两个不同的人口条件:

MySQL Py > a=800MySQL Py > b=500

绑定变量执行结果:

MySQL Py > sql_result2.bind(a)+------+--------------------+-------------------------------+------------+| id | name | country_name | population |+------+--------------------+-------------------------------+------------+| 62 | The Valley | Anguilla | 595 || 1791 | Flying Fish Cove | Christmas Island | 700 || 2316 | Bantam | Cocos (Keeling) Islands | 503 || 2317 | West Island | Cocos (Keeling) Islands | 167 || 2728 | Yaren | Nauru | 559 || 2805 | Alofi | Niue | 682 || 2912 | Adamstown | Pitcairn | 42 || 3333 | Fakaofo | Tokelau | 300 || 3538 | Città del Vaticano | Holy See (Vatican City State) | 455 |+------+--------------------+-------------------------------+------------+9 rows in set (0.0022 sec)MySQL Py > sql_result2.bind(b)+------+--------------------+-------------------------------+------------+| id | name | country_name | population |+------+--------------------+-------------------------------+------------+| 2317 | West Island | Cocos (Keeling) Islands | 167 || 2912 | Adamstown | Pitcairn | 42 || 3333 | Fakaofo | Tokelau | 300 || 3538 | Città del Vaticano | Holy See (Vatican City State) | 455 |+------+--------------------+-------------------------------+------------+4 rows in set (0.0023 sec)

2.3 Table 类:获取当前连接数据库下单张表,可以对这张表进行任何 DML 操作。(获取 Table 类之前,得先获取 Schema 类)

MySQL Py > ytt_schema1=ytt_cnx1.get_schema('world')MySQL Py > ytt_tbname1=ytt_schema1.get_table('city');

查找人口少于 800 的记录:

MySQL Py > ytt_tbname1.select().where("population<800")+------+--------------------+-------------+-------------+------------+| ID | Name | CountryCode | District | Population |+------+--------------------+-------------+-------------+------------+| 62 | The Valley | AIA | – | 595 || 1791 | Flying Fish Cove | CXR | – | 700 || 2316 | Bantam | CCK | Home Island | 503 || 2317 | West Island | CCK | West Island | 167 || 2728 | Yaren | NRU | – | 559 || 2805 | Alofi | NIU | – | 682 || 2912 | Adamstown | PCN | – | 42 || 3333 | Fakaofo | TKL | Fakaofo | 300 || 3538 | Città del Vaticano | VAT | – | 455 |+------+--------------------+-------------+-------------+------------+9 rows in set (0.0024 sec)

还可以继续排序以及限制记录数输出:

MySQL Py > ytt_tbname1.select().where("population<800").order_by("population desc ").limit(3)+------+------------------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+------+------------------+-------------+----------+------------+| 1791 | Flying Fish Cove | CXR | – | 700 || 2805 | Alofi | NIU | – | 682 || 62 | The Valley | AIA | – | 595 |+------+------------------+-------------+----------+------------+3 rows in set (0.0024 sec)

2.4 Table 类包含几个子类:TableSelect、TableInsert、TableUpdate、TableDelete。

1)TableSelect:保存查询结果

之前查找人口小于 800 的记录结果即为 TableSelect,可以基于此类来后续操作。

MySQL Py > tbselect1=ytt_tbname1.select().where("population<800")

只拿出部分字段:

MySQL Py > tbselect1.select("[id,name]").order_by("population desc").limit(2);+----------------------------+| JSON_ARRAY(`id`,`name`) |+----------------------------+| [1791, "Flying Fish Cove"] || [2805, "Alofi"] |+----------------------------+2 rows in set (0.0031 sec)

2)TableInsert:执行插入语句

插入一行:

MySQL Py > ytt_tbname1.count()4081MySQL Py > tbinsert1=ytt_tbname1.insert(["name","population","countrycode","district"]).values('test',1000000,'CHN','dd');MySQL Py > tbinsert1.execute();Query OK, 1 item affected (0.0054 sec)MySQL Py > ytt_tbname1.count()4082

插入多行:有两种方法。

多 VALUES 形式:

MySQL Py > tbinsert1=ytt_tbname1.insert(["name","population","countrycode","district"]).values('test',1000000,'CHN','dd').values('test',1000000,'CHN','dd');MySQL Py > tbinsert1.execute()Query OK, 2 items affected (0.0325 sec)Records: 2 Duplicates: 0 Warnings: 0MySQL Py > MySQL Py > ytt_tbname1.count()4084

多次执行或者包含在事务块里:

MySQL Py > ytt_cnx1.start_transaction();Query OK, 0 rows affected (0.0004 sec)MySQL Py > tbinsert1=ytt_tbname1.insert(["name","population","countrycode","district"]).values('test',1000000,'CHN','dd');MySQL Py > tbinsert1Query OK, 1 item affected (0.0008 sec)MySQL Py > tbinsert1Query OK, 1 item affected (0.0006 sec)MySQL Py > tbinsert1Query OK, 1 item affected (0.0008 sec)MySQL Py > tbinsert1Query OK, 1 item affected (0.0006 sec)MySQL Py > ytt_cnx1.commit();Query OK, 0 rows affected (0.2737 sec)MySQL Py > ytt_tbname1.count()4088

3)TableUpdate:执行更新语句

MySQL Py > tbupdate1=ytt_tbname1.update().set('district','nothing').where("name='test'")MySQL Py > tbupdate1Query OK, 0 items affected (0.0048 sec)Rows matched: 9 Changed: 9 Warnings: 0

4)TableDelete:执行删除语句

MySQL Py > tbdelete1=ytt_tbname1.delete().where("district='nothing'");MySQL Py > tbdelete1Query OK, 9 items affected (0.0112 sec)MySQL Py > ytt_tbname1.count()4079

三、SHELL 组件

SHELL 组件可以在 MySQL 和 MySQL X 间随意切换,并且连接后,包含了一个默认数据库类 “db” ,db 等价于 ytt_cnx1.get_current_schema()

MySQL Py > ytt_cnx_shell1=shell.connect(connection_urlx)Creating an X protocol session to 'root@localhost/world'Fetching schema names for autocompletion... Press ^C to stop.Your MySQL connection id is 10 (X protocol)Server version: 8.0.23 MySQL Community Server - GPLDefault schema `world` accessible through db

依然还是操作表 city,

MySQL localhost+ ssl world Py > ytt_tbname2=db.get_table("city") MySQL localhost+ ssl world Py > ytt_tbname2

之后的操作和之前 mysqlx 的一样。

MySQL localhost+ ssl world Py > ytt_tbname2.select(['id','name']).where("population<800").order_by("id desc").limit(3);+------+--------------------+| id | name |+------+--------------------+| 3538 | Città del Vaticano || 3333 | Fakaofo || 2912 | Adamstown |+------+--------------------+3 rows in set (0.0011 sec)

所以如果用 MySQL SHELL 来操作 mysql 关系表,推荐用 SHELL 组件的方式,非常灵活。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
刚刚官宣:全面取消“套娃”收费!网友不买账:早干嘛去了?

刚刚官宣:全面取消“套娃”收费!网友不买账:早干嘛去了?

有趣的火烈鸟
2024-09-30 10:59:14
85岁大爷:先后请了5个住家保姆,才发现请保姆养老根本不靠谱

85岁大爷:先后请了5个住家保姆,才发现请保姆养老根本不靠谱

烙任情感
2024-09-30 07:17:32
祝福祖国!天安门广场举行国庆升旗仪式

祝福祖国!天安门广场举行国庆升旗仪式

环球网资讯
2024-10-01 07:21:59
记者问"若解放军围困台湾咋办",台军老大瘪着嘴,说了句大实话

记者问"若解放军围困台湾咋办",台军老大瘪着嘴,说了句大实话

议纪史
2024-09-30 07:55:24
事实证明!收入永远对半分的凤凰传奇,彻底地走上了一条康庄大道

事实证明!收入永远对半分的凤凰传奇,彻底地走上了一条康庄大道

橘子大娱社
2024-09-30 21:40:02
穆大叔一路走好!穆托姆博生涯场均9.8分2.8帽 季后赛9.1分2.5帽

穆大叔一路走好!穆托姆博生涯场均9.8分2.8帽 季后赛9.1分2.5帽

直播吧
2024-09-30 23:05:00
孙院士责问华为,结果被打脸,央媒霸气回击:批评没道理

孙院士责问华为,结果被打脸,央媒霸气回击:批评没道理

佳人美食之情
2024-09-30 22:41:27
拜登“泄密”,终于让中国彻底认清美国,感谢拜登做了一件大好事

拜登“泄密”,终于让中国彻底认清美国,感谢拜登做了一件大好事

罗富强说
2024-09-30 16:37:12
南京楼市大获全胜,南京楼市奥体南房价从45000元调整为38000元

南京楼市大获全胜,南京楼市奥体南房价从45000元调整为38000元

有事问彭叔
2024-09-30 19:07:36
全红婵妈妈额头出现悬针纹,被网友提醒惊出一身冷汗

全红婵妈妈额头出现悬针纹,被网友提醒惊出一身冷汗

娱乐的小灶
2024-10-01 07:01:25
胡塞武装立大功,内塔尼亚胡生死未卜,美国方面可能该怎么办?

胡塞武装立大功,内塔尼亚胡生死未卜,美国方面可能该怎么办?

文雅笔墨
2024-10-01 00:01:37
战斗突然打响!中国两邻国大打出手,战机大炮狂轰滥炸,伤亡惨重

战斗突然打响!中国两邻国大打出手,战机大炮狂轰滥炸,伤亡惨重

日风的故事屋
2024-09-30 19:51:57
中国男单4胜2负,最新世界排名:小布进四强飙升27位,张之臻第41

中国男单4胜2负,最新世界排名:小布进四强飙升27位,张之臻第41

求球不落谛
2024-10-01 05:04:55
欧文: 为了后场出球赶走德赫亚, 为了前场高压干掉了C罗, 结果呢?

欧文: 为了后场出球赶走德赫亚, 为了前场高压干掉了C罗, 结果呢?

阿牛体育说
2024-10-01 07:45:13
贾玲与大碗娱乐正式决裂!张小斐跟随离开,被困了8年终于自由了

贾玲与大碗娱乐正式决裂!张小斐跟随离开,被困了8年终于自由了

公子麦少
2024-09-28 15:59:15
“看场电影300元没了?!”这笔钱,很多上海新能源车主吐槽太贵,网友却说,该收!

“看场电影300元没了?!”这笔钱,很多上海新能源车主吐槽太贵,网友却说,该收!

新民晚报
2024-09-29 15:03:18
打疯了!4-2完胜奥沙利文,4-0:中国名将强势晋级北爱赛正赛

打疯了!4-2完胜奥沙利文,4-0:中国名将强势晋级北爱赛正赛

全能体育柳号
2024-10-01 05:35:03
东方甄选小圆被曝出轨后续:老公公开喊话董宇辉,曝更多炸裂内幕

东方甄选小圆被曝出轨后续:老公公开喊话董宇辉,曝更多炸裂内幕

古希腊掌管松饼的神
2024-09-30 14:02:29
世界最长寿纪录再被刷新?

世界最长寿纪录再被刷新?

参考消息
2024-09-29 16:02:13
海参崴本该在1995年归还中国,斯大林亲笔签名同意,后来为何黄了

海参崴本该在1995年归还中国,斯大林亲笔签名同意,后来为何黄了

霹雳炮
2024-09-29 18:35:03
2024-10-01 09:44:49
爱可生云数据库技术
爱可生云数据库技术
用数据技术推动企业增长
345文章数 502关注度
往期回顾 全部

科技要闻

“双11”开战在即 京东、阿里重金砸向香港

头条要闻

牛弹琴:中国人在欢乐过大节 世界却在剧烈动荡中

头条要闻

牛弹琴:中国人在欢乐过大节 世界却在剧烈动荡中

体育要闻

穆大叔,最老的树,最高的山

娱乐要闻

王诗龄14岁全身名牌现身巴黎

财经要闻

恒大地产和许家印等,严惩!

汽车要闻

拒绝平庸 深蓝S05是台更有范儿的家用SUV

态度原创

本地
艺术
教育
健康
手机

本地新闻

云游中国|还有谁不知道 荆门人有属于自己的仙本那

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

教育要闻

初中竞赛题,解方程,思路清晰解题就会简单

花18万治疗阿尔茨海默病,值不值?

手机要闻

真我GT7 Pro双11前上市:首发定制万元屏 硬刚iPhone 16 Pro Max

无障碍浏览 进入关怀版