python MySQLdb 模块

发布时间:2019-09-15 10:01:33编辑:auto阅读(3548)

      用python操作mysql数据库,就会用到MySQLdb模块,这个模块其实和文件数据库SQLite的操作方式一样的

    先来看一下这模块的简单实用

    插入数据

    import MySQLdb
    #创建一个mysql的连接对象  
    conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
    #创建操作游标,一切对数据库的操作都是调用游标里的方法  
    cur = conn.cursor()
    """
    这里要注意,和其他模块不同的就是value里面参数的占位符,在mysql里面不管要value的值是什么类型,占位符只有%s一种模式。这要切记~~!! 
    """ 
    reCount =cur.execute('insert into UserInfo(Name,age) values(%s,%s)',('alex',18))
    #执行插入语句会返回成功插入的条目数。可以将这个条目数打印出来
    print reCount
    conn.commit()  
    cur.close()
    conn.close()

    这段代码有点数据库基础的的就可以看懂,其实就是在cur.execute()方法的括号里写入要执行的sql语句就好了。


    如果有多条语句需要插入,最简单的使用for循环的方式插入数据。但是模块自带了executemany方法可以更加方便的实现多条语句同时插入的功能

    import MySQLdb
    conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
    cur = conn.cursor()
    #以元组为单位,存入要插入的values值
    li =[
         ('alex','usa'),
         ('sb','usa'),
    ]
    #这里改成调用executemany()方法一次操作多条数据
    reCount = cur.executemany('insert into UserInfo(Name,Address) values(%s,%s)',li)
    conn.commit()
    cur.close()
    conn.close()
    print reCount


    查询操作是我们最常用的数据库操作,模块也为我们提供了很多选项

    查询操作

    import MySQLdb
    conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest')
    cur = conn.cursor()
    reCount = cur.execute('select * from user_list')
    #通过fetchone方法获取一条结果
    print cur.fetchone()
    print 'select %s lins'%reCount

    上面的代码执行结果是

    (1L, 1L, 'wgw', '123456', 0L)
    select 3 lins

    返回的统计结果是查询到了3条数据,我们只获得了一条。这是怎么回事?这是因为我们使用了fetchone方法。这个方法不管查询了多少条数据,它只取第一条。另外我们看到查询结果里面的有很多的L,这个L是表示我们查询出来的数字类型是Long int 长×××的。


    那如果我们要获取所有的查询结果怎么办呢?那就用fetchall()方法

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    import MySQLdb
    conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest')
    cur = conn.cursor()
    reCount = cur.execute('select * from user_list')
    #通过fetchall方法获取全部结果
    print cur.fetchall()
    print 'select %s lins'%reCount

    这次的执行结果如下

    ((1L, 1L, 'wgw', '123456', 0L), (2L, 2L, 'alex', '123456', 1L), (3L, 3L, 'eric', '123456', 0L))
    select 3 lins

    这样就查询出来了所有数据条目,fetchall的运行结果是用一个大的元组包含了所有的数据条目,其中每一个数据条目都用一个小元组表示。但是这种元组套元组的方式也很麻烦。比如我们要取用户名的字段值,那需要对元组的内容进行切片,先切大的再切小的。是不是很麻烦?这个我们也有办法解决。问题就是处在游标对象身上


    我们创建游标的对象的时候用的语句是

    cur = conn.cursor()

    这种模式,默认获取的结果都以元组形式展现。我们现在换一种创建对象的方法

    cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)

    这种方式指定了游标以字典的形式返回数据,我们来看看效果。

    先看看fetchone

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    import MySQLdb
    conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest')
    #cur = conn.cursor()
    #指定游标的数据返回类型
    cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
    reCount = cur.execute('select * from user_list')
    #通过fetchall方法获取全部结果
    print cur.fetchall()
    print 'select %s lines'%reCount

    运行结果如下

    {'tid': 1L, 'passwd': '123456', 'login_count': 0L, 'uid': 1L, 'name': 'wgw'}
    select 3 lines

    返回的查询结果变成字典形式了,字典的key就是字段名称,value就是我们查询的字段值。这样我们通过fetchone['name']这可以获得用户名。别切片方式省事多了


    再看看fetchall的效果

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    import MySQLdb
    conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest')
    #cur = conn.cursor()
    #指定游标的数据返回类型
    cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
    reCount = cur.execute('select * from user_list')
    #通过fetchall方法获取全部结果
    print cur.fetchall()
    print 'select %s lines'%reCount

    运行结果如下:

    ({'tid': 1L, 'passwd': '123456', 'login_count': 0L, 'uid': 1L, 'name': 'wgw'}, {'tid': 2L, 'passwd': '123456', 'login_count': 1L, 'uid': 2L, 'name': 'alex'}, {'tid': 3L, 'passwd': '123456', 'login_count': 0L, 'uid': 3L, 'name': 'eric'})
    select 3 lines

    看结果每个数据条目的内容已经用字典表示了,但是fetchall()方法还是会在结果最外层加个元组封装。这是没办法的事情了,但那也比最原始的模式要好操作的多。


    使用MySQLdb模块,个人的感觉就3点

    1、游标的获取类型指定为字典类型

    2、如果查询结果只有一条就用fetchone()方法,这样可以少处理一层元组

    3、好好学学数据库SQL语言,这个模块的核心还是调用数据库的SQL实现的。SQL写的不行其他的都白瞎了

关键字