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 "表已存在"

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐