
一.导入pymysql模块
导入pymysql之前需要先安装pymysql模块
方法一:直接在pycharm编译器里面输入 pip install pymysql
方法二:win+r -->输入cmd -->在里面输入pip install pymysql
ps:在cmd中输入pip list后回车 可以找到安装的pymysql就表示安装成功了
1
2
3
4
5
6
1
2
3
4
5
6
在pycharm编译器中导入
import pymysql
1
2
1
2
二.获取到database的链接对象
coon = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='pymysql_test')
1
1
user:是你的数据库用户名
password:数据库密码
database:你已经创建好的数据库
1
2
3
1
2
3
三.创建数据表的方法
cursor.execute(
'''create table if not exists pets(id int primary key auto_increment,
src varchar(50),
skill varchar(100)''')
1
2
3
4
1
2
3
4
四.获取执行sql语句的光标对象
cousor = coon.cousor()
1
1
五.定义要执行的sql语句
1.sql的增加数据的方法
sql = '''insert into test_mysql(id,src,skill) values(%d,%s,%s)'''
1
1
ps: test_mysql 是你连接到的数据库中的一张表
id,src,skill 这个是你创建表时所定义的字段关键字
%d,%s,%s 这个要根据你创建的字段关键字的类型而定,记住要一一对应
1
2
3
1
2
3
2.sql的删除数据的方法
sql_1 = '''delete from test_mysql where src=%s'''
1
1
3.sql的修改数据方法
sql_2 = '''update test_mysql set src=%s where skill=%s'
1
1
4.sql的查询方法
sql_3 = '''select * from test_mysql where skill = %s'''
1
1
六.通过光标对象执行sql语句
1.执行增加数据的sql语句
cousor.execute(sql, [2, 'www.sohu.com', '000000'])
运行后在mysql的可视化后台就可以直观的添加的数据
1
2
1
2
2.执行删除数据sql语句
new = 'www.baidu.com'
cousor.execute(sql_1, [new])
PS:这里就是根据sql语句where后面的条件进行删除对应的数据
要记住传入的数据要与sql的where后面条件匹配
1
2
3
4
1
2
3
4
3.执行修改数据的sql语句
url = 'www.baidu.com'
pwd = '666666'
cousor.execute(sql_2,[pwd,url])
1
2
3
1
2
3
4.执行查询数据的sql语句
result1 = cousor.fetchone()
fetchone() 查询=整个表中的第一条数据,
如果再次使用就会查找到第二条数据,
还可以在括号内输入id值查询到相应的数据
result2 = cousor.fetchmany()
fetchmany()查询到表里的多条数据,
在括号里输入几就会查找到表的前几条数据
result2 = cousor.fetchall()
fetchall()查询到sql查询匹配到的所有数据
print(result)
用print输出语句就能直接打印输出所查询到的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
**总结: 在执行sql语句要传入参数时,这个参数要以列表或者元组的类型传入**
1
1
七.关闭光标对象
cousor.close()
1
1
八.关闭数据库的链接对象
coon.cousor()
1
1
九.洛克王国宠物数据抓取案例
import requests
import pymysql
from lxml import etree
from time import sleep
# 数据库链接
conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='pymysql')
cursor = conn.cursor()
# 执行一条创建表的 *** 作
cursor.execute(
'''create table if not exists pets(id int primary key auto_increment,name varchar(50),src varchar(100),industry text)''')
url = 'http://news.4399.com/luoke/luokechongwu/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0Win64x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
response.encoding = 'gbk'
html = response.text
# print(html)
# 宠物名称
# 宠物图片(图片在 lz_src)
# 宠物技能(跳转详细页)
tree = etree.HTML(html)
li_list = tree.xpath('//ul[@id="cwdz_list"]/li') # 所有的宠物
for li in li_list:
name = li.xpath('./@name')[0] # 每一个宠物的名称
src = 'http:' + li.xpath('./a/img/@lz_src')[0] # 图片链接
link = 'http://news.4399.com' + li.xpath('./a/@href')[0] # 宠物的详细链接
industry = [] # 数组里面存放每一个对象,每一个对象就是一个技能
# 对详细链接发起请求,获取技能
try:
detail_resp = requests.get(url=link, headers=headers)
sleep(0.5)
detail_resp.encoding = 'gbk'
detail_tree = etree.HTML(detail_resp.text)
# 技能
skills = detail_tree.xpath('/html/body/div[5]/div[2]/div[2]/div[1]/div[1]/table[4]/tbody/tr')
del skills[0]
del skills[0]
for skill in skills:
item = {}
item['name'] = skill.xpath('./td[1]/text()')[0] # 技能
item['grade'] = skill.xpath('./td[2]/text()')[0] # 等级
item['property'] = skill.xpath('./td[3]/text()')[0] # 属性
item['type'] = skill.xpath('./td[4]/text()')[0] # 类型
item['target'] = skill.xpath('./td[5]/text()')[0] # 目标
item['power'] = skill.xpath('./td[6]/text()')[0] # 威力
item['pp'] = skill.xpath('./td[7]/text()')[0] # pp
item['result'] = skill.xpath('./td[8]/text()')[0] # 效果
industry.append(item)
# print(industry)
# 数据保存 (mysql)
sql = '''insert into pets(name,src,industry) values (%s,%s,%s)'''
cursor.execute(sql, [name, src, str(industry)])
conn.commit()
print(f'{name}--保存成功!')
except Exception as e:
pass
cursor.close()
conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
十.总结
本章内容主要是给大家讲解一下在爬虫过程中如何将数据保存mysql数据库中去,
最后面这个案例就是一个示范,希望这篇文章能给大家带来帮助,都看到这里了给
个三连支持一下吧!!!
1
2
3
1
2
3
将外部数据导入(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出于安全考虑的默认配置。因此,我们需要在配置文件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 Procedure中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procedure)的编写方式与在此之前有所不同。这里,我们需要使用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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)