美文网首页
MySQL Shell 3:操作文档型存储&关系型数据表

MySQL Shell 3:操作文档型存储&关系型数据表

作者: 轻松的鱼 | 来源:发表于2020-12-25 09:50 被阅读0次

JS模式:MySQL Shell for 文档型存储

如果使用过 MongoDB,则很容易理解文档型存储是什么意思。这是一种以 json 或 json 的变种格式存储数据的另一种存储方式,通常也被称为 NoSQL。

文档型存储与关系型数据库最明显的一点不同就是:不需要先定义表结构。有些地方说它“无模式”,字面上没啥毛病,但实际业务使用时,并非完全的“无模式”,还是要有一定的规范,只是“表结构”很灵活。

1. 建立连接

MySQL 中使用 X DevAPI 访问文档型存储。所以要使用文档型存储功能,必须连接 X Protocol 端口(默认33060端口):

mysqlsh root@172.16.22.1:33060/db1
2. CURD 操作

具体语法查看文档:https://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-operations.html

快速开始:

1. 确认 schema
db 是个全局变量,直接执行如果有输出则已经确认了 schema(相当于 use database):

JS > db

列出所有 schema(show database):

JS > session.getSchemas()
[
    <Schema:hucq>,
    <Schema:information_schema>,
    <Schema:mysql>,
    <Schema:mysql_innodb_cluster_metadata>,
    <Schema:mysqlslap>,
    <Schema:performance_schema>,
    <Schema:sys>,
    <Schema:world_x>
]

没有确认则使用 \use 命令确认数据库:

JS > \use world_x
Default schema `world_x` accessible through db.

JS > db
<Schema:world_x>

2. 列出库下所有集合(相当于关系型数据库的表)

JS > db.getCollections()
[
    <Collection:countryinfo>
]

3. 创建、删除集合

JS > db.createCollection("flags")
JS > db.getCollections()
[
   <Collection:countryinfo>,
   <Collection:flags>
]
JS > db.dropCollection("flags")

创建集合后,也可用切换到 sql 模式,用 show tables 命令看到:

SQL > show tables;
+-------------------+
| Tables_in_world_x |
+-------------------+
| city              |
| country           |
| countryinfo       |
| countrylanguage   |
| flags             |
+-------------------+
5 rows in set (0.0072 sec)

SQL > show create table flags\G
*************************** 1. row ***************************
       Table: flags
Create Table: CREATE TABLE `flags` (
  `doc` json DEFAULT NULL,
  `_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
  `_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
  PRIMARY KEY (`_id`),
  CONSTRAINT `$val_strict_77008DA65064FAF543C6109399AB20432EE703D7` CHECK (json_schema_valid(`_json_schema`,`doc`)) /*!80016 NOT ENFORCED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.0014 sec)

集合用的也是 InnoDB 引擎,集合与表的区别应该就是 “doc json DEFAULT NULL” 这一个字段的定义。

疑问:是如何实现的?暂时没做研究

4. 插入文档(相当于关系型数据库中的数据行)

JS > db.flags.add(
   {
      name:"hucq",
      age:18,
      city: {
         work:"shanghai",
         born:"changsha"
      }
   }
 )
Query OK, 1 item affected (0.0088 sec)

5. 查找文档

JS > db.flags.find("age >= 18 and city.born = 'beijing'")
{
    "_id": "00005e9818080000000000000005",
    "age": 28,
    "city": {
        "born": "beijing",
        "work": "shanghai"
    },
    "name": "jack"
}
1 document in set (0.0023 sec)

JS模式:MySQL Shell for 关系型数据表

X DevAPI 不止能操作文档型数据表,也能操作关系型数据表。具体语法见:https://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-relational-tables.html

快速开始:

1. 也是先确认 schema

2. 列出所有表

JS > db.getTables()
[
    <Table:city>,
    <Table:country>,
    <Table:countrylanguage>
] 

3. 插入数据

JS > db.city.insert("ID", "Name", "CountryCode", "District", "Info").values(
5000, "Olympia", "USA", "Washington", '{"Population": 5000}')

4. 查找数据

JS > db.city.select(["Name", "CountryCode"]).where("Name like 'Zar%' and CountryCode = 'NGA'")
+-------+-------------+
| Name  | CountryCode |
+-------+-------------+
| Zaria | NGA         |
+-------+-------------+
1 row in set (0.0023 sec)

5. 更新数据

JS > db.city.update().set("Name","Hucq").where("Name like 'Zar%' and CountryCode = 'NGA'")
Query OK, 1 item affected (0.0136 sec)
Rows matched: 1  Changed: 1  Warnings: 0

6. 删除数据

JS > db.city.delete().where("Name = 'Zaragoza'")
Query OK, 1 item affected (0.0151 sec)

7. 创建、删除表

没找到命令,尤其是手册里的 session.dropCollection(),并没有找到有这个命令

相关文章

网友评论

      本文标题:MySQL Shell 3:操作文档型存储&关系型数据表

      本文链接:https://www.haomeiwen.com/subject/iyemnktx.html