流式导入

本文档介绍如何使用 SQL 语句在 MatrixOne 中进行流式导入数据。具体来说,MatrixOne 支持使用 LOAD DATA INLINE 语法对以 csv 格式组织的字符串进行导入,导入速度较 INSERT 操作更快。

语法结构

  1. mysql> LOAD DATA INLINE
  2. FORMAT='csv' ,
  3. DATA=$XXX$
  4. csv_string $XXX$
  5. INTO TABLE tbl_name;

参数解释

FORMAT='csv' 表示后面 DATA 中的字符串数据是以 csv 为格式组织的。

DATA=$XXX$ csv_string $XXX$ 中的 $XXX$ 是数据开始和结束的标识符。csv_string 是以 csv 为格式组织字符串数据,以 \n 或者 \r\n 作为换行符。

Note

$XXX$ 为数据开始和结束的标识符,注意数据结束处的 $XXX$ 需要和最后一行数据放在同一行,换行可能导致 ERROR 20101

开始前准备

已完成单机部署 MatrixOne

MySQL Client 中使用 LOAD DATA INLINE 命令导入数据

你可以使用 LOAD DATA INLINE 将流式数据导入 MatrixOne,本章将介绍如何进行流式导入,并且给出导入 csv 数据的示例。

  1. 启动 MySQL 客户端,连接 MatrixOne:

    1. mysql -h 127.0.0.1 -P 6001 -uroot -p111

    Note

    上述代码段中的登录账号为初始账号,请在登录 MatrixOne 后及时修改初始密码,参见密码管理

  2. 在 MatrixOne 中执行 LOAD DATA INLINE 之前,需要提前在 MatrixOne 中创建完成数据表 user:

    1. CREATE TABLE `user` (
    2. `name` VARCHAR(255) DEFAULT null,
    3. `age` INT DEFAULT null,
    4. `city` VARCHAR(255) DEFAULT null
    5. )
  3. 在 MySQL 客户端执行 LOAD DATA INLINE 进行数据导入,以 csv 格式导入数据:

    1. mysql> LOAD DATA INLINE
    2. FORMAT='csv',
    3. DATA=$XXX$
    4. Lihua,23,Shanghai
    5. Bob,25,Beijing $XXX$
    6. INTO TABLE user;

Python-pymysql 应用中使用 LOAD DATA INLINE 命令导入数据

PyMySQL 是一个纯 Python MySQL 客户端库,下面将指导你如何使用 PyMySQL 进行 LOAD DATA INLINE 操作。

  1. 下载安装 pymysql:

    1. pip3 install pymysql
    2. #If you are in China mainland and have a low downloading speed, you can speed up the download by following commands.
    3. pip3 install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. 使用 MySQL 客户端连接 MatrixOne,新建一个名称为 test 数据库和 user 的数据表:

    1. mysql> create database test;
    2. use test;
    3. CREATE TABLE `user` (
    4. `name` VARCHAR(255) DEFAULT null,
    5. `age` INT DEFAULT null,
    6. `city` VARCHAR(255) DEFAULT null
    7. );
  3. 创建一个纯文本文件 pymysql_load_data_inline.py 并将代码写入文件,此处作为示范 csv_string 只写了两行,你可以根据自己的流式数据决定 csv_string 的大小:

    1. #!/usr/bin/python3
    2. import pymysql
    3. # Open database connection
    4. db = pymysql.connect(
    5. host='127.0.01',
    6. port=6001,
    7. user='root',
    8. password = "111",
    9. db='test',
    10. )
    11. # prepare a cursor object using cursor() method
    12. cursor = db.cursor()
    13. csv_string="Lihua,23,Shanghai \n Bob,25,Beijing"
    14. sql="load data inline format='csv',data=$XXX$" + csv_string + " $XXX$ into table user;"
    15. # execute SQL query using execute() method.
    16. cursor.execute(sql)
    17. data=db.commit()
    18. # Fetch a single row using fetchone() method.
    19. # disconnect from server
    20. db.close()
  4. 打开一个终端,在终端内执行下面的命令:

    1. python3 pymysql_load_data_inline.py
  5. 打开 mysql 客户端,查询数据表中的数据,结果如下:

    1. mysql> select * from user;
    2. +-------+------+-----------+
    3. | name | age | city |
    4. +-------+------+-----------+
    5. | Lihua | 23 | Shanghai |
    6. | Bob | 25 | Beijing |
    7. +-------+------+-----------+
    8. 2 rows in set (0.02 sec)