json文件存入mysql,怎麼導出json文件

本文目錄一覽:

如何將 JSON,Text,XML,CSV 數據文件導入 MySQL

將外部數據導入(import)數據庫是在數據庫應用中一個很常見的需求。其實這就是在數據的管理和操作中的ETL

(Extract,

transform,

load)的L

(Load)部分,也就是說,將特定結構(structure)或者格式(format)的數據導入某個目的地(比如數據庫,這裡我們討論MySQL)。

ETL

Process

本文要討論的內容,是如何方便地將多種格式(JSON,

Text,

XML,

CSV)的數據導入MySQL之中。

本文大綱:

將Text文件(包括CSV文件)導入MySQL

將XML文件導入MySQL

將JSON文件導入MySQL

使用MySQL

workbench的Table

Data

Export

and

Import

Wizard進行JSON或CSV文件的導入導出

1.

將Text文件(包括CSV文件)導入MySQL

這裡我們的討論是基於一個假定,Text

file和CSV

file是有着比較規範的格式的(properly

formatted),比如說每行的每個數據域(field)之間是由一個共同的分隔符(比如tab:

\t)分隔的。

那麼首先,你需要根據你的數據的格式(有哪些域),來設計好數據庫的對應的表

(的Schema)。

舉個例子,要處理的Text文件或者CSV文件是以\t作為分隔符的,每行有id,

name,

balance這麼三個數據域,那麼首先我們需要在數據庫中創建這個表:

CREATE

TABLE

sometable(id

INT,

name

VARCHAR(255),

balance

DECIMAL(8,4));

創建成功以後就可以導入了。操作方式很簡單:

LOAD

DATA

LOCAL

INFILE

‘你的文件路徑(如~/file.csv)’

INTO

TABLE

sometable

FIELDS

TERMINATED

BY

‘\t’

[ENCLOSED

BY

‘”‘(可選)]

LINES

TERMINATED

BY

‘\n’

(id,

name,

balance)

這裡要注意的是,我們需要開啟local-infile這個MySQL的配置參數,才能夠成功導入。究其原因,從MySQL的Manual中可以看到這麼一段話:

LOCAL

works

only

if

your

server

and

your

client

both

have

been

configured

to

permit

it.

For

example,

if

mysqld

was

started

with

–local-infile=0,

LOCAL

does

not

work.

See

Section

6.1.6,

“Security

Issues

with

LOAD

DATA

LOCAL”.

怎麼在mysql中放入json數據

我們知道,JSON是一種輕量級的數據交互的格式,大部分NO SQL數據庫的存儲都用JSON。MySQL從5.7開始支持JSON格式的數據存儲,並且新增了很多JSON相關函數。MySQL 8.0 又帶來了一個新的把JSON轉換為TABLE的函數JSON_TABLE,實現了JSON到表的轉換。

舉例一

我們看下簡單的例子:

簡單定義一個兩級JSON 對象

mysql set @ytt='{“name”:[{“a”:”ytt”,”b”:”action”},  {“a”:”dble”,”b”:”shard”},{“a”:”mysql”,”b”:”oracle”}]}’;Query OK, 0 rows affected (0.00 sec)

第一級:

mysql select json_keys(@ytt);+—————–+| json_keys(@ytt) |+—————–+| [“name”]        |+—————–+1 row in set (0.00 sec)

第二級:

mysql select json_keys(@ytt,’$.name[0]’);+—————————–+| json_keys(@ytt,’$.name[0]’) |+—————————–+| [“a”, “b”]                  |+—————————–+1 row in set (0.00 sec)

我們使用MySQL 8.0 的JSON_TABLE 來轉換 @ytt。

mysql select * from json_table(@ytt,’$.name[*]’ columns (f1 varchar(10) path ‘$.a’, f2 varchar(10) path ‘$.b’)) as tt;

+——-+——–+

| f1    | f2     |

+——-+——–+

| ytt   | action |

| dble  | shard  |

| mysql | oracle |

+——-+——–+

3 rows in set (0.00 sec)

舉例二

再來一個複雜點的例子,用的是EXPLAIN 的JSON結果集。

JSON 串 @json_str1。

set @json_str1 = ‘ {  “query_block”: {    “select_id”: 1,    “cost_info”: {      “query_cost”: “1.00”    },    “table”: {      “table_name”: “bigtable”,      “access_type”: “const”,      “possible_keys”: [        “id”      ],      “key”: “id”,      “used_key_parts”: [        “id”      ],      “key_length”: “8”,      “ref”: [        “const”      ],      “rows_examined_per_scan”: 1,      “rows_produced_per_join”: 1,      “filtered”: “100.00”,      “cost_info”: {        “read_cost”: “0.00”,        “eval_cost”: “0.20”,        “prefix_cost”: “0.00”,        “data_read_per_join”: “176”      },      “used_columns”: [        “id”,        “log_time”,        “str1”,        “str2”      ]    }  }}’;

第一級:

mysql select json_keys(@json_str1) as ‘first_object’;+—————–+| first_object    |+—————–+| [“query_block”] |+—————–+1 row in set (0.00 sec)

第二級:

mysql select json_keys(@json_str1,’$.query_block’) as ‘second_object’;+————————————-+| second_object                       |+————————————-+| [“table”, “cost_info”, “select_id”] |+————————————-+1 row in set (0.00 sec)

第三級:

mysql  select json_keys(@json_str1,’$.query_block.table’) as ‘third_object’\G*************************** 1. row ***************************third_object: [“key”,”ref”,”filtered”,”cost_info”,”key_length”,”table_name”,”access_type”,”used_columns”,”possible_keys”,”used_key_parts”,”rows_examined_per_scan”,”rows_produced_per_join”]1 row in set (0.01 sec)

第四級:

mysql select json_extract(@json_str1,’$.query_block.table.cost_info’) as ‘forth_object’\G*************************** 1. row ***************************forth_object: {“eval_cost”:”0.20″,”read_cost”:”0.00″,”prefix_cost”:”0.00″,”data_read_per_join”:”176″}1 row in set (0.00 sec)

那我們把這個JSON 串轉換為表。

SELECT * FROM JSON_TABLE(@json_str1,

“$.query_block”

COLUMNS(

rowid FOR ORDINALITY,

NESTED PATH ‘$.table’

COLUMNS (

a1_1 varchar(100) PATH ‘$.key’,

a1_2 varchar(100) PATH ‘$.ref[0]’,

a1_3 varchar(100) PATH ‘$.filtered’,

nested path ‘$.cost_info’

columns (

a2_1 varchar(100) PATH ‘$.eval_cost’ ,

a2_2 varchar(100) PATH ‘$.read_cost’,

a2_3 varchar(100) PATH ‘$.prefix_cost’,

a2_4 varchar(100) PATH ‘$.data_read_per_join’

),

a3 varchar(100) PATH ‘$.key_length’,

a4 varchar(100) PATH ‘$.table_name’,

a5 varchar(100) PATH ‘$.access_type’,

a6 varchar(100) PATH ‘$.used_key_parts[0]’,

a7 varchar(100) PATH ‘$.rows_examined_per_scan’,

a8 varchar(100) PATH ‘$.rows_produced_per_join’,

a9 varchar(100) PATH ‘$.key’

),

NESTED PATH ‘$.cost_info’

columns (

b1_1 varchar(100) path ‘$.query_cost’

),

c INT path “$.select_id”

)

) AS tt;

+——-+——+——-+——–+——+——+——+——+——+———-+——-+——+——+——+——+——+——+

| rowid | a1_1 | a1_2  | a1_3   | a2_1 | a2_2 | a2_3 | a2_4 | a3   | a4       | a5    | a6   | a7   | a8   | a9   | b1_1 | c    |

+——-+——+——-+——–+——+——+——+——+——+———-+——-+——+——+——+——+——+——+

|     1 | id   | const | 100.00 | 0.20 | 0.00 | 0.00 | 176  | 8    | bigtable | const | id   | 1    | 1    | id   | NULL |    1 |

|     1 | NULL | NULL  | NULL   | NULL | NULL | NULL | NULL | NULL | NULL     | NULL  | NULL | NULL | NULL | NULL | 1.00 |    1 |

+——-+——+——-+——–+——+——+——+——+——+———-+——-+——+——+——+——+——+——+

2 rows in set (0.00 sec)

當然,JSON_table 函數還有其他的用法,我這裡不一一列舉了,詳細的參考手冊。

請點擊輸入圖片描述

如何將從接口取到的json數據存入mysql數據庫

json的數據json.loads進來以後會變成一個json的對象,你需要自己把python對象中的字段值取出來,拼成sql語句

你可以把這個過程封裝成一個函數

import json

def save_json(json_str):

obj = json.loads(json_str)

sql = ‘insert into tbl values (“%s”)’ % obj[‘id’] #這裡注意編碼,要轉成數據庫的編碼格式

#blabla

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198674.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 10:26
下一篇 2024-12-04 10:26

相關推薦

發表回復

登錄後才能評論