美文网首页
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