python之MySQLdb库的使用
在开发的过程中避免不了和数据库的交互,在实际环境中用的最多的Mysql数据库,那python是怎么和Mysql进行交互的呢,python使用一个叫MySQLdb的库来连接MySQL,好的,下面最要从MySQLdb的安装、连接MySQL、执行sql语句、如何取得结果、关闭数据库连接来讲述一下:
MySQLdb的安装
我使用的是ubuntu系统,安装方法为:apt-get install python-MySQLdb,这样当在python环境执行import MySQLdb不报错就是安
root@ubuntu:~# python Python 2.7.4 (default, Apr 19 2013, 18:32:33) [GCC 4.7.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import MySQLdb >>>
如何连接Mysql
MySQLdb提供的connect方法用来和数据库建立连接,接收数个参数,返回连接对象,如:conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable",port=3306)
比较常用的参数包括:
host:数据库主机名.默认是用本地主机.
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值,如果在这里设置了db,则连接时直接连接到Mysql的db设置的数据库中
port:MySQL服务使用的TCP端口.默认是3306.注:connect中的host、user、passwd等可以不写,只有在写的时候按照host、user、passwd、db(可以不写)、port顺序写就可以,注意端口号port=3306还是不要省略的为好,如果没有db在port前面,直接写3306会报错
连接成功后,如需切换该用户的其他数据库,使用以下语句:conn.select_db('mysql')形式切换数据库
>>> con=MySQLdb.connect('localhost','root','123456',port=3306) >>> con.select_db('mysql') >>> cur=con.cursor() >>> cur.execute('show tables') 24L >>> cur.fetchall() (('columns_priv',), ('db',), ('event',), ('func',), ('general_log',), ('help_category',), ('help_keyword',), ('help_relation',), ('help_topic',), ('host',), ('ndb_binlog_index',), ('plugin',), ('proc',), ('procs_priv',), ('proxies_priv',), ('servers',), ('slow_log',), ('tables_priv',), ('time_zone',), ('time_zone_leap_second',), ('time_zone_name',), ('time_zone_transition',), ('time_zone_transition_type',), ('user',))
第1行:连接数据库 第2行:选择连接mysql这个数据库 第3行以下是获取数据库表,语法后面会讲
怎么操作数据库,MySQLdb用游标(指针)cursor的方式操作数据库
因该模块底层其实是调用C API的,所以,需要先得到当前指向数据库的指针
>>> cur=con.cursor()
数据库的操作和结果显示
我们利用cursor提供的方法来进行操作,方法主要是1.执行命令 2.接收结果
ursor用来执行命令的方法:
execute(query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone():返回一条结果行.
scroll(value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.先来看一下execute的增删改查的操作
#创建数据库51ctotest >>> cur.execute('create database 51ctotest') #选择数据库51ctotest >>>con.select_db('51ctotest') #创建表51cto,id自增 >>>cur.execute('create table if not exists 51cto(id int(11) PRIMARY KEY AUTO_INCREMENT,name varchar(20),age int(3))') #插入一行数据,只给name、age赋值,让id自增 #使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什#么类型,占位符永远都要用%s,后面的数值为元组或者列表 >>>cur.execute("insert into 51cto(name,age) values(%s,%s)",('fan',25)) #插入多行数据,用executemany,它会循环插入后面元组中的所有值 >>> cur.executemany("insert into 51cto(name,age) values(%s,%s)",(('te',25),('fei',26),('musha',25))) 3L #查询 >>> cur.execute('select * from 51cto') 5L #我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple >>> cur.fetchall() ((1L, 'fan', 25L), (2L, 'fan', 25L), (3L, 'te', 25L), (4L, 'fei', 26L), (5L, 'musha', 25L)) #再次查询,会看到查询不到结果,因为无论fetchone、fetchall、fetchmany指针是会发生移动的。所以,若不重置指针,那么使用fetchall的信息将只会包含指针后面的行内容。使用fetchall把指针挪到了最后,可以用scroll手动把指针挪到一个位置 >>> cur.fetchall() () >>> cur.scroll(1,'absolute') >>> for i in cur.fetchall(): ... print i ... (2L, 'fan', 25L) (3L, 'te', 25L) (4L, 'fei', 26L) (5L, 'musha', 25L)
这里有必要说一下scroll:
cur.scroll(int,parm)这里参数含义为:int:移动的行数,整数;在相对模式下,正数向下移动,负值表示向上移动。
parm:移动的模式,默认是relative,相对模式;可接受absoulte,绝对模式。#fetchone一次只取一行,指针下移 fetchmany(size)一次去size行 >>> cur.scroll(1,'absolute') >>> cur.fetchone() (2L, 'fan', 25L) >>> cur.fetchmany(2) ((3L, 'te', 25L), (4L, 'fei', 26L)) #普通取出是元组的形式,再从里面取值不好取,那怎么取成字典的格式呢,MySQLdb中有DictCursor,要做到这点也很简单,那就是建立数据库连接是传递cusorclass参数,或者在获取Cursor对象时传递cusorclass参数即可 >>> cur = con.cursor(cursorclass=MySQLdb.cursors.DictCursor) >>> cur.execute('select * from 51cto') 5L >>> for i in cur.fetchall(): ... print i ... {'age': 25L, 'id': 2L, 'name': 'fan'} {'age': 25L, 'id': 3L, 'name': 'te'} {'age': 26L, 'id': 4L, 'name': 'fei'} {'age': 25L, 'id': 5L, 'name': 'musha'} #更新,习惯%s的用法 >>> cur.execute('update 51cto set name=%s where id=3',('Mus')) >>> cur.scroll(2,'absolute') >>> cur.fetchone() {'age': 25L, 'id': 3L, 'name': 'Mus'} #在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保 存在数据库中 >>> con.commit() #最后关闭游标,关闭连接 >>> cur.close() >>> con.close()
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341