如何在 MySQL 中读取 JSON 值

Posted

技术标签:

【中文标题】如何在 MySQL 中读取 JSON 值【英文标题】:How to read JSON value in MySQL 【发布时间】:2020-10-31 20:40:25 【问题描述】:
'ohlc': 'open': 22719.25, 'high': 22880.0, 'low': 22665.4, 'close': 22610.75

我需要将 JSON 输出插入到我的数据库中,但我的源代码抛出错误:

源代码:

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='', database='connect')

insert_data_into_table = "insert into ticks(last_price,date,Volume,ins_token,ohlc) values(%(last_price)s,%(date)s,%(Volume)s," \
                         "%(ins_token)s, %(ohlc)s)"


def insert_ticks(ticks):
    cursor = conn.cursor()
    for tick in ticks:
        cursor.execute(insert_data_into_table,'last_price': tick['last_price'], 'date': tick['timestamp'], 'Volume': tick['volume'], 'ins_token': tick['instrument_token'], 'ohlc':tick['ohlc'])
    try:
        conn.commit()
    except Exception:
        conn.rollback()

谁能帮我解决这个问题,因为我需要获取开盘价、收盘价、高价和低价。

错误:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''open': '22755.65', 'high': '22820', 'low': '22325.4', 'close': '22908.1')' at line 1")

【问题讨论】:

请附上完整的错误信息。 试试,json.dumps(tick['ohlc']) 添加错误@DYZ 我在 for 循环中尝试了 json.dumps 但它抛出错误:@Sushanth 【参考方案1】:
    您有 5 列,因此有 5 个绑定变量。您的插入模板过于复杂 对于任何数据库操作,您应该使用批处理而不是逐行处理。你真的应该使用execute many() 我假设ohlc是JSON,只需要转成字符串
import mysql.connector
import json
from datetime import datetime
conn = mysql.connector.connect(host="127.0.0.1",user="sniffer",passwd="sniffer",database="sniffer")
curr = conn.cursor()
try: curr.execute("drop table ticks")
except: pass
curr.execute("create table ticks (last_price double, date datetime, Volume double, ins_token varchar(20), ohlc json)")
ohlc =  'open': 22719.25, 'high': 22880.0, 'low': 22665.4, 'close': 22610.75
ticks = ["last_price": 100.2, "timestamp":str(datetime.now()), "volume":30, 
          "instrument_token":"APPL", "ohlc":ohlc]
ins = "insert into ticks(last_price,date,Volume,ins_token,ohlc) values(%s, %s, %s, %s, %s)"
for tick in ticks:
    curr.execute(ins, (tick["last_price"], 
                       tick["timestamp"], 
                       tick["volume"], 
                       tick["instrument_token"],
                       json.dumps(tick["ohlc"])) )

curr.execute("select * from ticks")
curr.fetchall()

输出

[(100.2,
  datetime.datetime(2020, 7, 11, 15, 51, 33),
  30.0,
  'APPL',
  b'"open": 22719.25, "high": 22880.0, "low": 22665.4, "close": 22610.75')]

【讨论】:

如何将开、关、高分开作为一个单独的表格,我需要单独的值吗?你能帮我吗? @Rob Raymond 这主要是一个设计问题。 ticksohlc 有什么关系?看起来像 1:1 而不是 1:m。因此,如果您不使用 JSON 功能,只需将其他列添加到刻度表并存储为列。如果是 1:m 那么你需要考虑 PK 和 FK 的关系。基本关系数据库理论。如果您决定将 1:1 建模为两个表,您仍然有效地拥有需要 PK/FK 关系的主从关系

以上是关于如何在 MySQL 中读取 JSON 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中读取json格式的数组值

如何在python中读取嵌套的json数据值?

如何在JSON.NET中读取json对象值中的long值数组

如何从 PHP [Json results from open alpr] 中读取这种类型的 JSON 文件?

如何在 Swift 中使用 Combine 读取 JSON 错误对象的属性值?

如何在 JQuery 中将 json 响应读取为名称值对