python简单操作mysql
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python简单操作mysql相关的知识,希望对你有一定的参考价值。
引:
要想使用python操作mysql需要安装mysql-python插件,可以到mysql官网http://dev.mysql.com/downloads/connector/python/进行下载
我所使用的版本为MySQL-python-1.2.5.win32-py2.7,代表只支持使用python2.7。
相关的mysql操作请参考mysql 基本操作
下面为进行mysql增、删、改、查等相应操作:
查:
#!/usr/bin/env python # --*-- coding:utf-8 --*-- import MySQLdb #操作mysql,需要加载MySQLdb模块 #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) #使用connect方法对数据库进行连接,相当于一个门 cur = conn.cursor() #使用conn.cursor方法,相当于操作的一双手 #操作数据库 reCount = cur.execute(‘select * from students‘) #可以看到主函数的操作是查看students表 table = cur.fetchall() #将操作所得到的数据全部拿出来 # #关闭连接 cur.close() #结束操作后,将手拿回来 conn.close() #将门关上 print reCount #cur.execute返回的是操作影响的行数 print data
程序运行结果如下:
2 ((1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘), (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘))
增(插入):
import MySQLdb #操作mysql,需要加载MySQLdb模块 #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() #操作数据库 sql = ‘insert into students(name,sex,age,tel) values(%s,%s,%s,%s)‘ #主程序是添加,注意后面的values使用了占位符,即先占用,后面用params进行填充 params = (‘haha‘,‘woman‘,‘19‘,‘147258369‘) #定义一个元组,里面的内容会被添加到insert语句的valuse中 reCount = cur.execute(sql,params) #执行主程序的操作 conn.commit() #注意:相比较查看表,增加表内容,需要进行提交,否则,无法添加 reCount1 = cur.execute(‘select * from students‘) data = cur.fetchall() #再次将查看的内容拿出来,以验证是否成功添加了内容 #关闭连接 cur.close() conn.close() print reCount #cur.execute返回的是操作影响的行数 print data
程序运行结果如下:
1 ((1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘), (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘), (9L, ‘haha‘, ‘woman‘, 19, ‘147258369‘))
其中,id字段是自增的,如果将第3条内容,删除后,再重新添加,内容的id会变为4,而不是3,由于我之前进行了几次删除,所以这里的id变为了9,但是没有关系,我们可以看到,结果确实将‘haha’添加了进去。
改:
import MySQLdb conn = MySQLdb.connect(host=‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() sql = ‘update students set name = %s where age = %s‘ #将age为9的人的name值改为‘helen‘ params = (‘helen‘,‘9‘) reCount = cur.execute(sql,params) conn.commit() #注意:记得提交啊 reCount1 = cur.execute(‘select * from students‘) data = cur.fetchall() print reCount print data update
运行结果如下:
1 ((1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘), (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘), (9L, ‘helen‘, ‘woman‘, 19, ‘147258369‘))
可以看到age为9的元素,原来名字为haha,现在变成了helen,成功的修改了。
删:
import MySQLdb conn =MySQLdb.connect(host = ‘localhost‘,user = ‘root‘,passwd= ‘123‘,db = ‘mydb‘) #host也可以写成localhost,和sql语法一样 cur = conn.cursor() sql = ‘delete from students where id = %s‘ #将id为9的元素,从students中删除 params = (9,) #注意元组中只有一个数字的写法, reCount = cur.execute(sql,params) conn.commit() reCount1 = cur.execute(‘select * from students‘) data = cur.fetchall() print reCount print data
运行结果如下:
1 ((1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘), (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘))
可以看到刚才的helen的id为9,现在被删除了。
批量插入:
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur =conn.cursor() #操作数据库 sql = [(‘a‘,‘man‘,‘20‘,‘123‘),(‘b‘,‘woman‘,‘20‘,‘456‘)] #将要添加的内容列成一个有元组组成的列表 reCount = cur.executemany(‘insert into students(name,sex,age,tel) values(%s,%s,%s,%s)‘,sql) #注意这里的方法变成了executemany,后面加上我们的变量sql conn.commit() #再次重申,要提交 reCount1 = cur.execute(‘select * from students‘) data = cur.fetchall() #关闭连接 cur.close() conn.close() print reCount print data
运行结果如下:
2 #这里影响的行数是2,因为我们添加了两条 ((1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘), (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘), (11L, ‘a‘, ‘man‘, 20, ‘123‘), (12L, ‘b‘, ‘woman‘, 20, ‘456‘))
conn.cursor()
到这里我们发现,我们返回的只有表中的内容,但是没有字段值,即不知道我们的内容具体代表着什么,如果想要结果包含字段名,这里只需要对一条命令进行修改,我们仍以select程序为例。
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) #cur = conn.cursor() #这是我们之前使用的方法 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) #这是我们现在使用的方法 #操作数据库 reCount = cur.execute(‘select * from students‘) data = cur.fetchall() #关闭连接 cur.close() conn.close() print reCount print data
运行结果如下:
4 #这里影响的条数为4,因为现在表里一共有4个元素 ({‘age‘: 18, ‘sex‘: ‘man‘, ‘tel‘: ‘1234567890‘, ‘id‘: 1L, ‘name‘: ‘Demon‘}, {‘age‘: 25, ‘sex‘: ‘woma‘, ‘tel‘: ‘0987654321‘, ‘id‘: 2L, ‘name‘: ‘lily‘}, {‘age‘: 20, ‘sex‘: ‘man‘, ‘tel‘: ‘123‘, ‘id‘: 11L, ‘name‘: ‘a‘}, {‘age‘: 20, ‘sex‘: ‘woman‘, ‘tel‘: ‘456‘, ‘id‘: 12L, ‘name‘: ‘b‘}) # 注意:得到的结果是一个由4个字典构成的元组,每一个字典代表着一条内容,其中key为表的字段,values为对应元素的值,这样看起来就变的很直观
fetchall、fetchone、fetchmany:
cur.fetchall:一次就将操作的值全部拿过来
cur.fetchone:第一一次只拿第一条,第二次拿第二条。。。
cur.fetchmany(num):可以拿到num条数据
我们上面都是用的fetchall拿到操作的值,下面用fetchone()进行取值:
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() #cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) #操作数据库 reCount = cur.execute(‘select * from students‘) data = cur.fetchone() #使用fetchone() data = cur.fetchone() print data data = cur.fetchone() print data data = cur.fetchone() print data #关闭连接 cur.close() conn.close()
运行结果如下:
(2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘) (11L, ‘a‘, ‘man‘, 20, ‘123‘) (12L, ‘b‘, ‘woman‘, 20, ‘456‘) #我们发现,程序中一共使用了4次fetchone(),3次print,结果将对应的后3条内容打印了出来,而第一条没有print,所以没有返回第一条内容。
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() #cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) #操作数据库 reCount = cur.execute(‘select * from students‘) data = cur.fetchone() data = cur.fetchmany(3) #先拿到一条后,执行拿3条 print data #关闭连接 cur.close() conn.close()
运行结果如下:
((2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘), (11L, ‘a‘, ‘man‘, 20, ‘123‘), (12L, ‘b‘, ‘woman‘, 20, ‘456‘)) #可以看到因为前面拿到了一条数据,这里开始从第二条数据拿
scroll:(类似于指针)
scroll分为absolute和relative两种模式;
cur.scroll(-1,mode=‘relative‘)
cur.scroll(1,mode=‘absolute‘)
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() #cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) #操作数据库 reCount = cur.execute(‘select * from students‘) data = cur.fetchone() print data data = cur.fetchone() print data cur.scroll(-1,mode=‘relative‘) #注意:前面打印了2条,下面本来该打印第3条了,但是使用了relative 的scroll后,从当前位置倒回1位(-1),所以又回到第2条进行打印 data = cur.fetchone() print data data = cur.fetchone() print data #关闭连接 cur.close() conn.close()
结果:
(1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘) (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘) (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘) #这里从当前位置倒回1行,及第1行开始打印 (11L, ‘a‘, ‘man‘, 20, ‘123‘)
import MySQLdb #创建连接 conn = MySQLdb.connect(host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘123‘,db = ‘mydb‘) cur = conn.cursor() #cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) #操作数据库 reCount = cur.execute(‘select * from students‘) data = cur.fetchone() print data data = cur.fetchone() print data data = cur.fetchone() print data cur.scroll(0,mode=‘absolute‘) #前面打印了3条,下面该打印第4条,但使用了absolute的scroll后,从头(值为0)开始打印 data = cur.fetchone() print data #关闭连接 cur.close() conn.close()
结果:
(1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘) (2L, ‘lily‘, ‘woma‘, 25, ‘0987654321‘) (11L, ‘a‘, ‘man‘, 20, ‘123‘) (1L, ‘Demon‘, ‘man‘, 18, ‘1234567890‘) #这里又从头开始打印,即第0行开始打印
另外,还需注意一个cur.lastrowid,这里不做过多介绍。
以上是关于python简单操作mysql的主要内容,如果未能解决你的问题,请参考以下文章
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段