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         
select

程序运行结果如下:

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
insert
程序运行结果如下:
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
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
delete

运行结果如下:

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
View Code

运行结果如下:

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()          
fetchone()

运行结果如下:

(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()
fetchmany(num)

运行结果如下:

((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()           
relative

结果:

(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()
absolute

结果:

(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的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段

python简单操作mysql

用python代码简单连接MySQL以及插入数据的两种方法

Apollo Codegen 没有找到生成代码的操作或片段

python3 的 mysql 简单操作