前言
前几日做了一个Python操作MySQL的项目,参考了GitHub上mysql2graph的一些功能,故记录一下,
本篇包含了从建库删库到增删查改的系列操作,适合于初次使用python操作mysql的新手食用。此
教程通过从csv读取数据存到MySQL中并进行增删查改操作的实例进行讲解。
ps:阅读本文需要一定的SQL语法基础,如有不懂之处,推荐到W3school学习。
pps:如在代码实现上有逻辑问题等请谅解,作者也是菜鸡。
本教程使用到的工具包有:pandas,pymysql
此次要导入的数据表—node_graph1 如下所示:
node_id | node_list | node_label |
---|---|---|
1 | A | graph |
2 | B | graph |
3 | C | graph |
4 | D | graph |
5 | E | graph |
该表存储了五个图中的结点。
1.写一个简单的初始化类
利用pymysql连接数据库,使用类建造可以提高复用性,减少代码量。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# author:silenceZheng
class MySQL_processor:
def __init__(self, host, port, user, password, database=None):
if database is None:
self.cnx = pymysql.connect(
host=host,
port=port,
user=user,
password=password
)
else:
self.cnx = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database
)
self.cursor = self.cnx.cursor()
可以看到,该类实现了初始化函数,函数包括打开数据库连接和建立游标对象。
2.建库
建库包括从pandas读取数据和生成数据库
execute表示执行SQL语句
设置主键为node_id1
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# author:silenceZheng
import pandas as pd
def build(host, port, user, password, database):
connector = MySQL_processor(host, port, user, password)
connector.cursor.execute('CREATE DATABASE IF NOT EXISTS %s' %(database))
connector.cnx.close()
connector = MySQL_processor(host, port, user, password, database)
### node_graph1
df = pd.read_csv('./node_graph1.csv')
table = 'node_graph1'
connector.cursor.execute("""
CREATE TABLE IF NOT EXISTS `%s` (
`node_id` int NOT NULL,
`node_list` varchar(255) NULL,
`node_label` varchar(255) NULL,
PRIMARY KEY (`node_id`)
) ENGINE=InnoDB""" %(table))
vals = []
for row in df.itertuples(index=False, name=None):
val = []
for i in row:
#print(i);
if str(i) == 'nan':
val.append(None)
else:
i = i.strip() if type(i) is str else i
val.append(i)
#print(tuple(val))
vals.append(tuple(val))
CMD = "INSERT INTO `%s` (`node_id`, `node_list`, `node_label`) VALUES (%s) ON DUPLICATE KEY UPDATE node_id = `node_id`" %(table, '%s, %s, %s')
connector.cursor.executemany(CMD, vals)
connector.cnx.commit()
这样打开MySQL查看就可以发现数据库建成了。
3.删库
从删库到跑路,先学一下删库。1
2
3
4
5# author:silenceZheng
def drop(host, port, user, password, database):
connector = MySQL_processor(host, port, user, password)
connector.cursor.execute('DROP DATABASE %s' %(database))
connector.cnx.close()
非常简单,好的可以跑了。
4.插入(一条)、删除、更新
这三个功能实现起来是一致的,就放在一起写了,主要还是SQL语句的不同。以插入为例:1
2
3
4
5
6
7
8
9# author:silenceZheng
#插入
# sql = 'INSERT INTO node_graph1 VALUES(%s,%s,%s);'
# insert(host, port, user, password, database, sql, ('6', 'F', 'graph'))
def insert(host, port, user, password, database, sql, args):
connector = MySQL_processor(host, port, user, password, database)
result = connector.cnx.cursor().execute(sql, args)
print(result)
connector.cnx.commit()
这就实现了向node_graph1表中插入一行数据。当然你也可以选择只向其中几列加入数据,这和你
输入的SQL语句有关,这里不多做解释。
其他两个功能实现与本函数相同,只是SQL语句不同,这里贴一下其他俩的SQL语句(毕竟号称傻瓜教程)1
2
3
4
5
6
7
8
9
5.插入多条
这个基本与前面一致,只是在pymysql语法上有细微差别,因为是傻瓜教程就说一下。1
2
3
4
5
6
7
8
9
10# author:silenceZheng
#插入多条
# sql = 'insert into node_graph1 VALUES (%s,%s,%s)'
# args = [('8', 'H', 'tu'), ('9', 'I', 'tu'), ('10', 'J', 'tu')]
# insert_many(host, port, user, password, database, sql=sql, args=args)
def insert_many(host, port, user, password, database, sql, args):
connector = MySQL_processor(host, port, user, password, database)
result = connector.cnx.cursor().executemany(query=sql, args=args)
print(result)
connector.cnx.commit()
6.查询
查询这里用我构造的连接类不能完成,会报错,具体原因还未知,所以采用另一种写法,这个
坑就留到下次更博再解决吧。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# author:silenceZheng
#查询
# sql = 'SELECT * FROM node_graph1;'
# query(sql,None)
def get_conn():
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='graph')
return conn
def query(sql, args):
conn = get_conn()
cur = conn.cursor()
cur.execute(sql, args)
results = cur.fetchall()
print(type(results)) # 返回<class 'tuple'> tuple元组类型
for row in results:
print(row)
pass
conn.commit()
cur.close()
conn.close()
这样就可以实现查询了。
7.main函数
函数都做完了就写一个main执行一下看看效果好了。
我的db名字是graph1
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# author:silenceZheng
def main():
# MySQL 信息(改成自己 local 環境)
host='127.0.0.1'
port=3306
user='root'
password=''
database='graph'
build(host, port, user, password, database)
增查
sql = 'INSERT INTO node_graph1 VALUES(%s,%s,%s);'
insert(host, port, user, password, database, sql, ('6', 'F', 'graph'))
sql = 'SELECT * FROM node_graph1;'
query(sql, None)
删查
sql = 'DELETE FROM node_graph1 WHERE node_id = %s;'
args = ('2',) # 单个元素的tuple写法
delete(host, port, user, password, database, sql,args)
sql = 'SELECT * FROM node_graph1;'
query(sql, None)
改查
sql = 'UPDATE node_graph1 SET node_list=%s WHERE node_id = %s;'
args = ('X', '3')
update(host, port, user, password, database, sql, args)
sql = 'SELECT * FROM node_graph1;'
query(sql, None)
drop(host, port, user, password, database) # drop database
if __name__ == '__main__':
main()
运行后结果如下:
node_id | node_list | node_label |
---|---|---|
1 | A | graph |
3 | X | graph |
4 | D | graph |
5 | E | graph |
6 | F | graph |
总结
以上就是本次傻瓜教程的全部内容了,最后试一下Markdown插图片。