1、安装PyMySQL
首先使用pip安装PyMySQL库
pip install PyMySQL
然后在代码中import即可。
2、连接数据库
在Python中使用MySQL,比较习惯上下文的方式,即通过Python的with语句来使用。
如果要采用这种方式的话,需要第一一个专门用来处理数据的类,类的定义如下所示:
#!/usr/bin/python
# coding:UTF-8
"""
Description: 由于所有的网络数据都存放在数据库中,所以专门定义一个用于处理数据库的模块
Versions:
- Created by gkk in 20190820
:: 创建该模块,并定义有关数据的相关操作
Notes:
- A: Add,新增
- M: Modify,修改
- D: Delete,删除
- N: Annotation,注释
- T: Test,测试
"""
import pymysql
class DB:
def __init__(self, host_name, pwd, db_name, user='root'):
"""
:description
- 类的初始化构造函数
:parameters
- host_name: 表示数据库的主机地址,如果在本地则为 localhost;如果为远程,则应该为远程端主机ip地址
- pwd: 表示数据的登录密码
- db_name: 表示想要访问的数据的名称
:versions
- Added by gkk in 20190820: 添加该函数,并添加基本功能
"""
# 建立连接
self.conn = pymysql.connect(host=host_name,
port=3306,
user=user,
password=pwd,
database=db_name,
charset='utf8')
# 创建游标,指明以字典的形式获取数据库数据
self.cur = self.conn.cursor(pymysql.cursors.DictCursor)
def __enter__(self):
"""
:description
- 上下文管理器,支持 with 进行上下文管理,当进入 with 语句时,调用该函数
- 主要功能是返回创建的游标对象
:return
- self.cur: 返回操作数据的游标
:versions
- Added by gkk in 20190820: 添加该函数,并添加基本功能
"""
# 返回游标
return self.cur
def __exit__(self, exc_type, exc_val, exc_tb):
"""
:description
- 上下文管理器,支持 with 进行上下文管理,当跳出 with 执行语句时,调用该函数
- 主要功能是关闭与数据库的连接
:versions
- Added by gkk in 20190820: 添加该函数,并添加基本功能
"""
# 提交数据库并执行
self.conn.commit()
# 关闭游标
self.cur.close()
# 关闭数据库连接
self.conn.close()
"""
if __name__ == '__main__':
with NetworkDB('localhost', 'mysql123456+', 'db_test') as db:
sql_cmd = 'select * from site_data'
db.execute(sql_cmd)
fetch_data = db.fetchall()
for i in fetch_data:
print(i)
"""
需要注意的是,为了防止在在数据库中处理中文出现乱码的故障,最好设置成统一的数据编码格式,以utf8为例:
1、数据库创建时需指定为utf8格式;
2、建立数据库的连接时,指明连接方式为utf8
3、创建数据表时,指明表的格式为utf8
3、操作数据库
3.1、创建表
with DB(host, pwd, db_name, user) as db:
# 获取数据库中所有的数据表
sql_cmd = 'SHOW TABLES'
db.execute(sql_cmd)
fetch_data = db.fetchall()
fetch_list = [x[u"Tables_in_db_name"] for x in fetch_data]
# 判断业务路由表:business_route 是否存在
table_name = "business_route"
sql_cmd = '''
CREATE TABLE table_name(
id INT NOT NULL,
src_node CHAR(100),
dst_node CHAR(100),
route CHAR(100))CHARACTER SET UTF8'''
db.execute(sql_cmd)
上面代码创建了一个名为table_name的表,已utf8编码格式创建;
3.2、插入数据
with DB(host, pwd, db_name, user) as db:
# 插入一条数据,id为1
sql_cmd = "INSERT INTO table_name (id) VALUES (1)"
db.execute(sql_cmd)
上面的代码向表table_name中插入了一条数据,其中只对字段id进行了赋值,其他值均为默认值。
3.3、更新数据
with DB(host, pwd, db_name, user) as db:
# 更新id为1的数据条目
sql_cmd = "UPDATE table_name SET src_node={0}, dst_node={1}, route={2} WHERE id=1"format(op_alm_dur, op_sw, op_sw_dur)
db.execute(sql_cmd)
3.4、查询数据
with DB(host, pwd, db_name, user) as db:
# 获取id为1的数据条目
sql_cmd = "SELECT * FROM table_name WHERE id=1"
db.execute(sql_cmd)
fetch_data = db_cursor.fetchone() # 返回值以字典形式返回
src_node= fetch_data["src_node"]
dst_node= fetch_data["dst_node"]
另外需要注意的是,如果id字段的类型为CHAR,则需要加上单引号,如下所示:
sql_cmd = "SELECT * FROM table_name WHERE id='1'"
3.5、查询表中有多少条数据
with DB(host, pwd, db_name, user) as db:
# 获取数据表中存储了多少数据
sql_cmd = "SELECT COUNT(*) FROM table_name"
db.execute(sql_cmd)
fetch_data = db_cursor.fetchone() # 返回值以字典形式返回
count_num = fetch_data[u'COUNT(*)']
其中count_num即为数据表存储的数据条目的个数。
3.6、查询最后一条数据
可以使用limit语句获取数据表中的最后一条数据:
with DB(host, pwd, db_name, user) as db:
# 先获取数据表中存储了多少数据
sql_cmd = "SELECT COUNT(*) FROM table_name"
db.execute(sql_cmd)
fetch_data = db_cursor.fetchone() # 返回值以字典形式返回
count_num = fetch_data[u'COUNT(*)']
# 然后通过limit获取指定数据
sql_cmd = 'SELECT * FROM table_name LIMIT {1}, 1'.format(count_num-1)
db.execute(sql_cmd)
fetch_data = db.fetchone()
对于limit语句,第一个参数为偏移量,因为我们要去最后一条数据,所以只需要便宜count_num-1即可;第二个参数为在偏移量的基础上取数据的个数,因为是最后一条,所以值为1。
3.7、查询某个表是否存在
with DB(host, pwd, db_name, user) as db:
# 获取数据库中所有的数据表
sql_cmd = 'SHOW TABLES'
db.execute(sql_cmd)
fetch_data = db.fetchall()
fetch_list = [x[u"Tables_in_db_name"] for x in fetch_data]
# 判断业务路由表:business_route 是否存在
table_name = "business_route"
if table_name in fetch_list:
print "表已存在"