因为出于个人项目的需要,获取到的数据都是json类型的,并且都要存入MySQL数据库中,因为json类型数据不像一般的文本数据,所以在存入MySQL时需要注意的问题很多。
在网上找了很多方法,整理了一下比较实用可靠的,总结下来就是下面的过程:
MySQL表中需要保证存储json数据的列类型为BLOB;
使用sql语句时,使用MySQLdb.excape_string函数来对json数据进行转义;
查询数据时,将结果使用json.loads就能够得到原来的Python数据类型;
下面就来实战一下,实际上,在我的需求中,我需要将Python中的字典存入MySQL,所以只能先将其转换为json来处理。
1.实战存储json数据到MySQL中
(1)数据存储
1.创建能存储json数据类型的数据库表
mysql> create table jsondata -> ( -> id int(6) auto_increment primary key, -> data blob(1024) -> );Query OK, 0 rows affected (0.25 sec)mysql> show tables;+-------------------+| Tables_in_spyinux |+-------------------+| jsondata || test |+-------------------+2 rows in set (0.00 sec)mysql> describe jsondata;+-------+--------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+--------+------+-----+---------+----------------+| id | int(6) | NO | PRI | NULL | auto_increment || data | blob | YES | | NULL | |+-------+--------+------+-----+---------+----------------+2 rows in set (0.00 sec)
2.使用Python生成json数据类型
>>> import json>>> d = {‘name‘: ‘xpleaf‘}>>> type(d)<type ‘dict‘>>>> d_json = json.dumps(d)>>> d_json‘{"name": "xpleaf"}‘>>> type(d_json)<type ‘str‘>
3.使用MySQLdb连接MySQL数据库
>>> import MySQLdb>>> conn = m.connect(host=‘localhost‘, port=3306, user=‘root‘, passwd=‘123456‘, db=‘spyinux‘)>>> cur = conn.cursor()
4.写原生sql语句
>>> tsql = "insert into jsondata(data) values(‘{json}‘)";
5.使用MySQLdb方法转义json数据
>>> sql = tsql.format(json=MySQLdb.escape_string(d_json));>>> sql‘insert into jsondata(data) values(‘{"name": "xpleaf"}‘)‘
6.执行sql语句
>>> cur.execute(sql)1L>>> cur.execute(sql)1L
(2)数据查询
上面的操作完成之后,我们已经成功将json的数据存取到MySQL中,关键是能不能将该数据取出来,并且最后还原成Python的字典类型类型。
1.先在MySQL中查询存储的数据
mysql> select * from jsondata;+----+--------------------+| id | data |+----+--------------------+| 1 | {"name": "xpleaf"} |+----+--------------------+1 row in set (0.00 sec)
2.在Python交互器中查询数据
>>> cur.execute(‘select * from jsondata‘);1L>>> mydata = cur.fetchall()>>> mydata((1L, ‘{"name": "xpleaf"}‘),)>>> mydata = mydata[0][1]>>> mydata‘{"name": "xpleaf"}‘>>> type(mydata)<type ‘str‘>
3.使用json.loads解析json数据
>>> mydata = json.loads(mydata)>>> mydata{u‘name‘: u‘xpleaf‘}>>> type(mydata)<type ‘dict‘>>>> mydata[‘name‘]u‘xpleaf‘>>> mydata.get(‘name‘)u‘xpleaf‘
可以看到,最开始我们使用Pythonn创建了一个字典类型的数据,之后将其转换为json数据类型,以便于存入MySQL中,在这个过程中需要使用MySQL.escape_string方法来对json数据进行转义,最后查询数据时,我们使用json.loads方法来解析json数据,从而得到我们最开始存储的Python字典类型数据。
2.在实际当中的应用
显然,如果在使用Python的过程中,需要将字典或其它数据类型的数据存入到MySQL中时,先将其转换为json类型数据,再使用上面的方法,就非常简便了。
本文出自 “香飘叶子” 博客,请务必保留此出处http://xpleaf.blog.51cto.com/9315560/1905368
使用Python向MySQL数据库中存入json类型数据
标签:python json mysqldb
小编还为您整理了以下内容,可能对您也有帮助:
python中 如何将从接口取到的json数据存入mysql数据库 最好有具体的例子 谢谢
python操作mysql,没怎么折腾过。
不过网上资料一堆一堆的,自己google一下即可。
如果你需要json转换成对应的对象的话,倒是可以参考我写的:
【整理】什么是JSON+如何处理JSON字符串
其中就有关于python的:
【整理】Python中将(字典,列表等)变量格式化成(漂亮的,树形的,带缩进的,JSON方式的)字符串输出
【经验记录】Python中json.loads的时候出错->要注意要解码的Json字符的编码
(此处不给贴地址,请用google搜标题,即可找到帖子地址)追问话说我需要的是如何把json格式的数据的值存入mysql
追答直接把json字符串,存入mysQL?
那和单个的字符,存入mysql,就没区别了。
那就只剩下,python如何保持数据到mysql中了。
这样的问题,随便一搜,都一大把啊。
如何将从接口取到的json数据存入mysql数据库
mysql数据库建立表,存储json字段用text类型
然后从接口中获取JSON数据,转成STRING格式,直接插入到这个字段就可以了。
从数据库里python获取数据存到本地数据库
昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西。花了一个钟简单学习了python的基础语法,然后参照网上的例子自己写了个爬虫。 (推荐学习:Python视频教程)
python数据爬下来保存在本地,一般是文件或数据库中,但是文件形式相比要更加简单,如果只是自己写爬虫玩,可以用文件形式来保存数据。
#coding=utf-8import urllib.requestimport reimport os '''Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据urlopen 方法用来打开一个urlread方法 用于读取Url上的数据''' def getHtml(url): page = urllib.request.urlopen(url); html = page.read(); return html; def getImg(html): imglist = re.findall('img src="(http.*?)"',html) return imglist html = getHtml("https://www.zhihu.com/question/34378366").decode("utf-8");imagesUrl = getImg(html); if os.path.exists("D:/imags") == False: os.mkdir("D:/imags"); count = 0;for url in imagesUrl: print(url) if(url.find('.') != -1): name = url[url.find('.',len(url) - 5):]; bytes = urllib.request.urlopen(url); f = open("D:/imags/"+str(count)+name, 'wb'); f.write(bytes.read()); f.flush(); f.close(); count+=1;
经测试,基本功能还是可以实现的。花的较多的时间就是正则匹配哪里,因为自己对正则表达式也不是非常熟悉。所以还是花了点时间。
注:上面的程序基于 python 3.5。python3 和 python2 还是有些区别的。我刚开始看基础语法的时候就栽了一些坑里。
从数据库里python获取数据存到本地数据库
昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西。花了一个钟简单学习了python的基础语法,然后参照网上的例子自己写了个爬虫。 (推荐学习:Python视频教程)
python数据爬下来保存在本地,一般是文件或数据库中,但是文件形式相比要更加简单,如果只是自己写爬虫玩,可以用文件形式来保存数据。
#coding=utf-8import urllib.requestimport reimport os '''Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据urlopen 方法用来打开一个urlread方法 用于读取Url上的数据''' def getHtml(url): page = urllib.request.urlopen(url); html = page.read(); return html; def getImg(html): imglist = re.findall('img src="(http.*?)"',html) return imglist html = getHtml("https://www.zhihu.com/question/34378366").decode("utf-8");imagesUrl = getImg(html); if os.path.exists("D:/imags") == False: os.mkdir("D:/imags"); count = 0;for url in imagesUrl: print(url) if(url.find('.') != -1): name = url[url.find('.',len(url) - 5):]; bytes = urllib.request.urlopen(url); f = open("D:/imags/"+str(count)+name, 'wb'); f.write(bytes.read()); f.flush(); f.close(); count+=1;
经测试,基本功能还是可以实现的。花的较多的时间就是正则匹配哪里,因为自己对正则表达式也不是非常熟悉。所以还是花了点时间。
注:上面的程序基于 python 3.5。python3 和 python2 还是有些区别的。我刚开始看基础语法的时候就栽了一些坑里。
mysql使用什么类型存json数据(什么数据库适合存json)
将记录转为Json格式
public
JSONArrayjsonArray=JSONArray.fromObject();
JsonConfigjsonConfig=newJsonConfig();
JSONArray=newJSONArray();
TbaseModel=null;
for(inti=0;i JSONObjectrowData=(JSONObject)jsonArray.get(i); baseModel=(T)JSONObject.toBean(rowData,beanClass); JSONObjectjo=JSONObject.fromObject(baseModel,jsonConfig); .add(jo); } jsonString=new(); jsonString.append(.toString()); //返回结果集 returnjsonString.toString(); } //使用实例 StringstrData=(users,S_USER.class,null,users.size()); //users:多条记录;S_USER:POJO类 mysql使用什么类型存json数据(什么数据库适合存json) 将记录转为Json格式 public JSONArrayjsonArray=JSONArray.fromObject(); JsonConfigjsonConfig=newJsonConfig(); JSONArray=newJSONArray(); TbaseModel=null; for(inti=0;i JSONObjectrowData=(JSONObject)jsonArray.get(i); baseModel=(T)JSONObject.toBean(rowData,beanClass); JSONObjectjo=JSONObject.fromObject(baseModel,jsonConfig); .add(jo); } jsonString=new(); jsonString.append(.toString()); //返回结果集 returnjsonString.toString(); } //使用实例 StringstrData=(users,S_USER.class,null,users.size()); //users:多条记录;S_USER:POJO类 如何使用Python处理JSON数据 如何使用Python处理JSON数据 mysql数据库中某个字段存的是json数据,如何对json数据中的数据进行操作? 这个可以吧json格式的字符串解析成数组json_decode()函数,变成数组以后就可以方便操作了,可以删除数组中的任意一项,也可以增加一项比如:array_push($data,['sort'=>3,'catentryId'=>10003]),再变成json格式的存入数据库。方法有多种,这里简单的示例下 python向mysql中插入数据提示错误? 答:数据库本身是不支持字典类型的(已知的绝大多) python向mysql中插入数据提示错误? 答:数据库本身是不支持字典类型的(已知的绝大多) python调用第三方api接口写入数据库 在Python中调用第三方 API 接口并将数据写入数据库可分为以下几个步骤: python调用第三方api接口写入数据库 在Python中调用第三方 API 接口并将数据写入数据库可分为以下几个步骤: 如何将从接口取到的json数据存入mysql数据库 直接以json字符串像写其他普通字符串一样存到数据库就行了。没什么区别,只要选的数据库数据类型正确就可以 如何将JSON,Text,XML,CSV 数据文件导入 MySQL 将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入某个目的地(比如数据库,这里我们讨论MySQL)。 如何将JSON,Text,XML,CSV 数据文件导入 MySQL 将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入某个目的地(比如数据库,这里我们讨论MySQL)。
如何使用Python处理JSON数据?本篇文章就给大家介绍使用Python处理JSON数据的基本方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
在介绍使用Python处理JSON数据的基本方法之前,我们首先要了解一下什么是JSON?
JSON代表“JavaScript Object Notation”,可以说是“基于JavaScript语言符号的数据格式”。但是,该表示法仅基于JavaScript,可用于其他各种语言。
JSON是我们存储和交换数据的一种方式,它通过其语法实现,并在许多Web应用程序中使用。JSON的优点在于它具有人类可读的格式,这可能是在数据传输中使用它的原因之一,此外还有使用API时的有效性。
在JSON中,数据以名称/值(name/value)对表示;大括号内存储对象,每个名称后跟':'(冒号),名称/值对之间要用(逗号)分隔;方括号包含数组,值以(逗号)分隔。
JSON格式数据的示例:
{
"book1":{
"title": "Python Beginners",
"year": 2005 ,
"page": 399
},
"book2":{
"title": "Python Developers",
"year": 2006 ,
"page": 650
}
}下面我们来详细了解一下在Python中如何处理JSON数据。
Python使得处理JSON数据变得简单。实现此目的的模块是json模块。该模块应该包含在Python(内置)安装中,因此你不需要像使用PDF和Excel文件那样安装任何外部模块。要使用此模块,你唯一需要的是导入它(开头写入):
import json但是,JSON库是做什么的呢?此库主要从文件或字符串解析JSON。它还将JSON解析为Python中的字典或列表,反之亦然,即将Python字典或列表转换为JSON字符串。
读取JSON(JSON转Python)
读JSON意味着将JSON转换为Python值(对象)。如上所述,json库将JSON解析为Python中的字典或列表。为此,我们使用loads()函数(从字符串加载),如下所示:
import json
jsonData = '{"name": "Frank", "age": 39}'
jsonToPython = json.loads(jsonData)如果要查看输出,请执行 print jsonToPython,在这种情况下,你将获得以下输出:
{'age': 39, 'name': 'Frank'}也就是说,数据作为Python字典(JSON对象数据结构)返回。
Python转JSON
上一节我们介绍了JSON转Python,这一节我们将向你展示如何将Python值转换(编码)为JSON。
假设我们在Python中有以下字典:
import json
pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True}
dictionaryToJson = json.mps(pythonDictionary)如果我们运行 print dictionaryToJson,我们得到以下JSON数据:
{"age": 44, "isEmployed": true, "name": "Bob"}因此,此输出被视为对象(Dictionary)的数据表示。该方法mps()是此类操作的关键。
此时需要注意的是,JSON不能存储所有类型的Python对象,只能存储以下类型:列表; 字典; 布尔值; 数; 字符串; 没有。因此,需要转换任何其他类型以便存储在JSON中。
假设我们有以下课程:
class Employee(object):
def __init__(self, name):
self.name = name假设我们创建了一个新对象abder,如下所示:
abder = Employee('Abder')如果我们想将此对象转换为JSON,该怎么办?那是json.mps(abder)?在这种情况下,你将收到类似于以下内容的错误:
Traceback (most recent call last):
File "test.py", line 8, in <mole>
abderJson = json.mps(abder)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in mps
return _default_encoder.encode(obj)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable但是,有解决方法吗?幸运的是有。要解决此问题,我们可以定义类似于以下的方法:
def jsonDefault(object):
return object.__dict__然后将对象编码为JSON,如下所示:
jsonAbder = json.mps(abder, default=jsonDefault)如果你运行 print jsonAbder,你应该得到以下输出:
{"name": "Abder"}我们现在已经将Python对象(abder)编码为JSON。
如何使用Python处理JSON数据?本篇文章就给大家介绍使用Python处理JSON数据的基本方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。
在介绍使用Python处理JSON数据的基本方法之前,我们首先要了解一下什么是JSON?
JSON代表“JavaScript Object Notation”,可以说是“基于JavaScript语言符号的数据格式”。但是,该表示法仅基于JavaScript,可用于其他各种语言。
JSON是我们存储和交换数据的一种方式,它通过其语法实现,并在许多Web应用程序中使用。JSON的优点在于它具有人类可读的格式,这可能是在数据传输中使用它的原因之一,此外还有使用API时的有效性。
在JSON中,数据以名称/值(name/value)对表示;大括号内存储对象,每个名称后跟':'(冒号),名称/值对之间要用(逗号)分隔;方括号包含数组,值以(逗号)分隔。
JSON格式数据的示例:
{
"book1":{
"title": "Python Beginners",
"year": 2005 ,
"page": 399
},
"book2":{
"title": "Python Developers",
"year": 2006 ,
"page": 650
}
}下面我们来详细了解一下在Python中如何处理JSON数据。
Python使得处理JSON数据变得简单。实现此目的的模块是json模块。该模块应该包含在Python(内置)安装中,因此你不需要像使用PDF和Excel文件那样安装任何外部模块。要使用此模块,你唯一需要的是导入它(开头写入):
import json但是,JSON库是做什么的呢?此库主要从文件或字符串解析JSON。它还将JSON解析为Python中的字典或列表,反之亦然,即将Python字典或列表转换为JSON字符串。
读取JSON(JSON转Python)
读JSON意味着将JSON转换为Python值(对象)。如上所述,json库将JSON解析为Python中的字典或列表。为此,我们使用loads()函数(从字符串加载),如下所示:
import json
jsonData = '{"name": "Frank", "age": 39}'
jsonToPython = json.loads(jsonData)如果要查看输出,请执行 print jsonToPython,在这种情况下,你将获得以下输出:
{'age': 39, 'name': 'Frank'}也就是说,数据作为Python字典(JSON对象数据结构)返回。
Python转JSON
上一节我们介绍了JSON转Python,这一节我们将向你展示如何将Python值转换(编码)为JSON。
假设我们在Python中有以下字典:
import json
pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True}
dictionaryToJson = json.mps(pythonDictionary)如果我们运行 print dictionaryToJson,我们得到以下JSON数据:
{"age": 44, "isEmployed": true, "name": "Bob"}因此,此输出被视为对象(Dictionary)的数据表示。该方法mps()是此类操作的关键。
此时需要注意的是,JSON不能存储所有类型的Python对象,只能存储以下类型:列表; 字典; 布尔值; 数; 字符串; 没有。因此,需要转换任何其他类型以便存储在JSON中。
假设我们有以下课程:
class Employee(object):
def __init__(self, name):
self.name = name假设我们创建了一个新对象abder,如下所示:
abder = Employee('Abder')如果我们想将此对象转换为JSON,该怎么办?那是json.mps(abder)?在这种情况下,你将收到类似于以下内容的错误:
Traceback (most recent call last):
File "test.py", line 8, in <mole>
abderJson = json.mps(abder)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in mps
return _default_encoder.encode(obj)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable但是,有解决方法吗?幸运的是有。要解决此问题,我们可以定义类似于以下的方法:
def jsonDefault(object):
return object.__dict__然后将对象编码为JSON,如下所示:
jsonAbder = json.mps(abder, default=jsonDefault)如果你运行 print jsonAbder,你应该得到以下输出:
{"name": "Abder"}我们现在已经将Python对象(abder)编码为JSON。
方法有两种:
1、把字典或者json格式数据作为字符串(string)直接插入、读取的时候再转为字典。
2、为了避免某些字符、引号等转义问题发生、可以使用base64编码后导入数据库、读取时候再用base64解码。
也可以试试这个:
sql="insertintoaccount·userdata(user、passwd)values(%s、%s)"cursor.execute(sql、(name、passwd-md5))试试这个,
或者:sql="insertintoaccunt.userdata(user.passwd)values(%s%s)"%(name、passwd-md5)
oursor.execute(sql)。
方法有两种:
1、把字典或者json格式数据作为字符串(string)直接插入、读取的时候再转为字典。
2、为了避免某些字符、引号等转义问题发生、可以使用base64编码后导入数据库、读取时候再用base64解码。
也可以试试这个:
sql="insertintoaccount·userdata(user、passwd)values(%s、%s)"cursor.execute(sql、(name、passwd-md5))试试这个,
或者:sql="insertintoaccunt.userdata(user.passwd)values(%s%s)"%(name、passwd-md5)
oursor.execute(sql)。
1.安装依赖库
使用 requests 库发送 HTTP 请求,并使用 PyMySQL 库连接 MySQL 数据库。您可以使用以下命令在 Python 中安装这两个库:
pip install requests
pip install pymysql
2.发送 API 请求
使用 requests 库向第三方 API 发送请求,获取到需要存储到数据库的数据。
例如,以下代码通过调用和风天气 API 获取天气数据:
import requests
r=requests.get('https://api.heweather.net/s6/weather/now?location=beijing&key=your_key')
data = r.json() # 将请求的结果转换为JSON 格式数据
3.处理 API 返回数据
根据 API 返回的数据格式,提取需要存入数据库的字段数据。您可以使用字符串操作或 JsonPath 等库来提取数据。
例如,以下代码从 API 返回数据中提取出温度(tmp)和湿度(hum)字段的值:
tmp = data['HeWeather6'][0]['now']['tmp']
hum = data['HeWeather6'][0]['now']['hum']
4.连接数据库
使用 PyMySQL 库连接 MySQL 数据库。请确保您已经安装 PyMySQL 库,并且数据库信息是正确的。
例如,以下代码连接本地 MySQL 数据库:
import pymysql
conn =pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')
5.将数据写入数据库
使用 PyMySQL 库将数据写入数据库中。
例如,以下代码将温度和湿度数据插入到 weather 表中:
cursor = conn.cursor()
# 表名:weather,字段:tmp、hum
sql = "INSERT INTO weather (tmp, hum) VALUES (%s, %s)"
# 插入数据
try:
cursor.execute(sql, (tmp, hum))
conn.commit()
print('数据插入成功!')
except Exception as e:
conn.rollback()
print('数据插入失败!', e)
cursor.close()
conn.close()
6.完整代码如下:
import requests
import pymysql
# 发送 API 请求,获取天气数据
r=requests.get('https://api.heweather.net/s6/weather/now?location=beijing&key=your_key')
data = r.json()
# 处理 API 返回数据,提取温度和湿度
tmp = data['HeWeather6'][0]['now']['tmp']
hum = data['HeWeather6'][0]['now']['hum']
# 连接 MySQL 数据库
conn = pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')
# 将数据写入数据库
cursor = conn.cursor()
# 表名:weather,字段:tmp、hum
sql = "INSERT INTO weather (tmp, hum) VALUES (%s, %s)"
# 插入数据
try:
cursor.execute(sql, (tmp, hum))
conn.commit()
print('数据插入成功!')
except Exception as e:
conn.rollback()
print('数据插入失败!', e)
cursor.close()
conn.close()
在本例中,我们假设使用的是 MySQL 数据库,当然也可以使用其他类型的数据库,具体操作方式可能会略有不同,但是主要的操作步骤是类似的。
1.安装依赖库
使用 requests 库发送 HTTP 请求,并使用 PyMySQL 库连接 MySQL 数据库。您可以使用以下命令在 Python 中安装这两个库:
pip install requests
pip install pymysql
2.发送 API 请求
使用 requests 库向第三方 API 发送请求,获取到需要存储到数据库的数据。
例如,以下代码通过调用和风天气 API 获取天气数据:
import requests
r=requests.get('https://api.heweather.net/s6/weather/now?location=beijing&key=your_key')
data = r.json() # 将请求的结果转换为JSON 格式数据
3.处理 API 返回数据
根据 API 返回的数据格式,提取需要存入数据库的字段数据。您可以使用字符串操作或 JsonPath 等库来提取数据。
例如,以下代码从 API 返回数据中提取出温度(tmp)和湿度(hum)字段的值:
tmp = data['HeWeather6'][0]['now']['tmp']
hum = data['HeWeather6'][0]['now']['hum']
4.连接数据库
使用 PyMySQL 库连接 MySQL 数据库。请确保您已经安装 PyMySQL 库,并且数据库信息是正确的。
例如,以下代码连接本地 MySQL 数据库:
import pymysql
conn =pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')
5.将数据写入数据库
使用 PyMySQL 库将数据写入数据库中。
例如,以下代码将温度和湿度数据插入到 weather 表中:
cursor = conn.cursor()
# 表名:weather,字段:tmp、hum
sql = "INSERT INTO weather (tmp, hum) VALUES (%s, %s)"
# 插入数据
try:
cursor.execute(sql, (tmp, hum))
conn.commit()
print('数据插入成功!')
except Exception as e:
conn.rollback()
print('数据插入失败!', e)
cursor.close()
conn.close()
6.完整代码如下:
import requests
import pymysql
# 发送 API 请求,获取天气数据
r=requests.get('https://api.heweather.net/s6/weather/now?location=beijing&key=your_key')
data = r.json()
# 处理 API 返回数据,提取温度和湿度
tmp = data['HeWeather6'][0]['now']['tmp']
hum = data['HeWeather6'][0]['now']['hum']
# 连接 MySQL 数据库
conn = pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')
# 将数据写入数据库
cursor = conn.cursor()
# 表名:weather,字段:tmp、hum
sql = "INSERT INTO weather (tmp, hum) VALUES (%s, %s)"
# 插入数据
try:
cursor.execute(sql, (tmp, hum))
conn.commit()
print('数据插入成功!')
except Exception as e:
conn.rollback()
print('数据插入失败!', e)
cursor.close()
conn.close()
在本例中,我们假设使用的是 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出于安全考虑的默认配置。因此,我们需要在配置文件my.cnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/my.cnf中),确保:
local-infile=1
抑或是在命令行启动MySQL时加上--local-infile这一项:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我们也可以使用MySQL的一个官方导入程序mysqlimport ,这个程序本质上就是为LOAD DATA FILE提供了一个命令行的interface,很容易理解,我们这里就不再详述。
2. 将XML文件导入MySQL
这件事的完成方式,与我们的XML的形式有着很大的关系。
举个例子说,当你的XML数据文件有着很非常规范的格式,比如:
<?xml version="1.0"?>
<row>
<field name="id">1</field>
<field name="name">Free</field>
<field name="balance">2333.3333</field>
</row>
<row>
<field name="id">2</field>
<field name="name">Niki</field>
<field name="balance">1289.2333</field>
</row>
或者
<row column1="value1" column2="value2" .../>
我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册--LOAD XML Syntax。
然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v5.0.7以后,MySQL的Stored Procere中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procere)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。
以下是一个示例XML文件和程序:
文件:
<?xml version="1.0"?>
<some_list>
<someone id="1" fname="Rob" lname="Gravelle"/>
<someone id="2" fname="Al" lname="Bundy"/>
<someone id="3" fname="Little" lname="Richard"/>
</some_list>
程序:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))
BEGIN
declare xml_content text;
declare v_row_index int unsigned default 0;
declare v_row_count int unsigned;
declare v_xpath_row varchar(255);
set xml_content = load_file(path);
-- calculate the number of row elements.
set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
-- loop through all the row elements
while v_row_index < v_row_count do
set v_row_index = v_row_index + 1;
set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
insert into applicants values (
extractValue(xml_content, concat(v_xpath_row, '[1]')),
extractValue(xml_content, concat(v_xpath_row, '[2]')),
extractValue(xml_content, concat(v_xpath_row, '[3]'))
);
end while;
END
在MySQL中,使用它进行导入:
call import_some_xml('你的XML文件路径', '/some_list/someone');
程序相当的直白,只要了解一下MySQL的脚本编写即可。
这里提一下DELIMITER $$。我们知道MySQL的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。
3. 将JSON文件导入MySQL
如何将JSON文件导入MySQL中,是一个很有趣的话题。JSON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。
很多时候,我们处理的JSON数据是以如下形式出现的:
{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}
而并不是规整的[{},{},{},{}](一些NoSQL数据库的Export)。
这样的形势对于载入有一个好处:因为每一行是一个JSON Object,所以我们便可以按行处理此文件,而不需要因为JSON的严格结构将整个文件(比如一个许多G的.json文件)全部载入。
方式一 使用common-schema
common-schema是一个应用很广泛的MySQL的框架,它有着很丰富的功能和详细的文档。我们可以使用它的JSON解析的功能。(它还具有JSON转换成XML等等方便的功能)
具体说来,将common-schema导入之后,使用它的extract_json_value函数即可。源码中:
create function extract_json_value(
json_text text charset utf8,
xpath text charset utf8
) returns text charset utf8
该函数接受两个参数,一个是json_text,表示json文件的内容,另一个是xpath,表示数据的结构(这里可以类比XML文件的处理)。很多读者应该知道,XPath是用来对XML中的元素进行定位的,这里也可以作一样的理解。
以本段开始的几行JSON为例,这里common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
关于event_data,我们需要先理解LOAD DATA INFILE是一个event,不同的event type对应不同的event data。这部分知识可以参看Event Data for Specific Event Types
如果感兴趣,可以参看其源码。参看一个受到广泛使用的项目的源码,对于自身成长是很有益的。
当然了,我们也可以像之前处理XML文件导入一样,自己编写程序。这里便不再给出实例程序,有兴趣的读者可以自行编写或者跟笔者交流。
方式二 使用mysqljsonimport
这是Anders Karlsson的一个完成度很高的作品。这一份程序由C写成。它依赖于一个JSON Parser,Jansson。他们都有着比较好的维护和文档,所以使用上体验很好。
mysqljsonimport的下载在SourceForge上。具体使用参照其文档即可。
为了方便不熟悉源码安装的朋友,笔者在这里提一下安装流程和注意事项。
安装命令顺序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz
$ tar xvfz mysqljsonimport-1.6.tar.gz
$ cd mysqljsonimport-1.6
$ ./configure –-with-mysql=/xxx/mysql
$ make
$ make check
$ sudo make install
--with-mysql这一步不是必要的,只要你安装的mysql的路径是系统的默认路径。很关键的,而且很容易被不熟悉的朋友忽略的是,这一个C程序要成功编译和运行,是需要MySQL的C API的,所以需要安装的依赖,除了jansson,还有libmysqlclient-dev。
jansson的安装就是简单的源码安装,libmysqlclient-dev则可以使用包管理工具(比如ubuntu中使用apt-get即可;编译和安装前,建议先sudo apt-get update以避免不必要的麻烦)。
导入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
还有一个parser,作者是Kazuho,感兴趣的读者可以参看一下,他的相关博文是mysql_json - a MySQL UDF for parsing JSON ,github项目是mysql_json。
4. 使用MySQL workbench
Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和JSON文件。
具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。
文/freenik(简书作者)
原文链接:http://www.jianshu.com/p/d330edb61fe2
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出于安全考虑的默认配置。因此,我们需要在配置文件my.cnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/my.cnf中),确保:
local-infile=1
抑或是在命令行启动MySQL时加上--local-infile这一项:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我们也可以使用MySQL的一个官方导入程序mysqlimport ,这个程序本质上就是为LOAD DATA FILE提供了一个命令行的interface,很容易理解,我们这里就不再详述。
2. 将XML文件导入MySQL
这件事的完成方式,与我们的XML的形式有着很大的关系。
举个例子说,当你的XML数据文件有着很非常规范的格式,比如:
<?xml version="1.0"?>
<row>
<field name="id">1</field>
<field name="name">Free</field>
<field name="balance">2333.3333</field>
</row>
<row>
<field name="id">2</field>
<field name="name">Niki</field>
<field name="balance">1289.2333</field>
</row>
或者
<row column1="value1" column2="value2" .../>
我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册--LOAD XML Syntax。
然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v5.0.7以后,MySQL的Stored Procere中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procere)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。
以下是一个示例XML文件和程序:
文件:
<?xml version="1.0"?>
<some_list>
<someone id="1" fname="Rob" lname="Gravelle"/>
<someone id="2" fname="Al" lname="Bundy"/>
<someone id="3" fname="Little" lname="Richard"/>
</some_list>
程序:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))
BEGIN
declare xml_content text;
declare v_row_index int unsigned default 0;
declare v_row_count int unsigned;
declare v_xpath_row varchar(255);
set xml_content = load_file(path);
-- calculate the number of row elements.
set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
-- loop through all the row elements
while v_row_index < v_row_count do
set v_row_index = v_row_index + 1;
set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
insert into applicants values (
extractValue(xml_content, concat(v_xpath_row, '[1]')),
extractValue(xml_content, concat(v_xpath_row, '[2]')),
extractValue(xml_content, concat(v_xpath_row, '[3]'))
);
end while;
END
在MySQL中,使用它进行导入:
call import_some_xml('你的XML文件路径', '/some_list/someone');
程序相当的直白,只要了解一下MySQL的脚本编写即可。
这里提一下DELIMITER $$。我们知道MySQL的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。
3. 将JSON文件导入MySQL
如何将JSON文件导入MySQL中,是一个很有趣的话题。JSON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。
很多时候,我们处理的JSON数据是以如下形式出现的:
{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}
而并不是规整的[{},{},{},{}](一些NoSQL数据库的Export)。
这样的形势对于载入有一个好处:因为每一行是一个JSON Object,所以我们便可以按行处理此文件,而不需要因为JSON的严格结构将整个文件(比如一个许多G的.json文件)全部载入。
方式一 使用common-schema
common-schema是一个应用很广泛的MySQL的框架,它有着很丰富的功能和详细的文档。我们可以使用它的JSON解析的功能。(它还具有JSON转换成XML等等方便的功能)
具体说来,将common-schema导入之后,使用它的extract_json_value函数即可。源码中:
create function extract_json_value(
json_text text charset utf8,
xpath text charset utf8
) returns text charset utf8
该函数接受两个参数,一个是json_text,表示json文件的内容,另一个是xpath,表示数据的结构(这里可以类比XML文件的处理)。很多读者应该知道,XPath是用来对XML中的元素进行定位的,这里也可以作一样的理解。
以本段开始的几行JSON为例,这里common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
关于event_data,我们需要先理解LOAD DATA INFILE是一个event,不同的event type对应不同的event data。这部分知识可以参看Event Data for Specific Event Types
如果感兴趣,可以参看其源码。参看一个受到广泛使用的项目的源码,对于自身成长是很有益的。
当然了,我们也可以像之前处理XML文件导入一样,自己编写程序。这里便不再给出实例程序,有兴趣的读者可以自行编写或者跟笔者交流。
方式二 使用mysqljsonimport
这是Anders Karlsson的一个完成度很高的作品。这一份程序由C写成。它依赖于一个JSON Parser,Jansson。他们都有着比较好的维护和文档,所以使用上体验很好。
mysqljsonimport的下载在SourceForge上。具体使用参照其文档即可。
为了方便不熟悉源码安装的朋友,笔者在这里提一下安装流程和注意事项。
安装命令顺序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz
$ tar xvfz mysqljsonimport-1.6.tar.gz
$ cd mysqljsonimport-1.6
$ ./configure –-with-mysql=/xxx/mysql
$ make
$ make check
$ sudo make install
--with-mysql这一步不是必要的,只要你安装的mysql的路径是系统的默认路径。很关键的,而且很容易被不熟悉的朋友忽略的是,这一个C程序要成功编译和运行,是需要MySQL的C API的,所以需要安装的依赖,除了jansson,还有libmysqlclient-dev。
jansson的安装就是简单的源码安装,libmysqlclient-dev则可以使用包管理工具(比如ubuntu中使用apt-get即可;编译和安装前,建议先sudo apt-get update以避免不必要的麻烦)。
导入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
还有一个parser,作者是Kazuho,感兴趣的读者可以参看一下,他的相关博文是mysql_json - a MySQL UDF for parsing JSON ,github项目是mysql_json。
4. 使用MySQL workbench
Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和JSON文件。
具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。
文/freenik(简书作者)
原文链接:http://www.jianshu.com/p/d330edb61fe2