摘自:RUNOOB.COM
安装
PyMySQL
首先安装PyMySQL,直接输入pip install PyMysQL
即可
MySQL-Python
还要确保你的MySQL数据支持python连接,点击下载
注意:如果你想使用python的MySQLdb模块,你必须安装并使用python2.6以上,python3以下的版本,python3及以后的版本都不会再支持MySQLdb模块
基础操作
数据库的基础操作的流程大同小异
连接数据库−>获取游标−>【创建数据库表−>】进行具体操作−>【异常处理−>】关闭数据库
数据库连接
db = pymysql.connect("localhost","root","*****","TESTDB")
param1:host类型
param2:用户名,如果是root操作,就是root(也就是说,一般你在个人windows下进行操作,就是root)
param3:用户名的密码,如果不知道是什么密码,请移步看初始化的步骤,我强调过的。
param4:要连接的数据库名称(前提是必须先创建此数据库,不然无法连接,也不会自动创建)
获取游标
db = pymysql.connect("localhost","root","******","TESTDB")
cursor = db.cursor()
使用cursor()方法会返回一个对象,后面对数据库的操作都是对获取的游标进行的操作,我将这个游标当作数据库的“地址”看待,或者直接将它看成数据库也行,不影响后面的操作。
对数据库的操作基本上都是将数据库的命令写道sql变量中然后放到execute方法中,可以不用每条execute后面都紧接着使用commit方法提交,但直到提交完成,这些操作才会在数据库
中生效:也就是说,比如你在前面先创建了一个表并exectute,虽然没有提交到数据库,但只要execute,后面的操作会认为你的动作已经完成,最后一次commit就会全部生效
创建数据库表
#重复的代码不再重复写,只写伪代码
#连接数据库
...
#创建一个游标对象
...
#创建表
sql = """CREATE TABLE EMPLOYEE(
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20) NOT NULL,
AGE INT)"""
cursor.execute(sql)
#关闭数据库
db.close()
数据库插入
#重复的代码不再重复写,只写伪代码
#连接数据库
...
#创建一个游标对象
...
#创建表
...
#插入数据
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,AGE) VALUES('Mac','Monhan',20)"""
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
多解
可以写成另外一种形式
#前面步骤都不变
#插入数据
sql = "INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME,AGE) \
VALUES('%s','%s','%d')%('Mac','Mohan',20)"
#后面也不变
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
其实values('...(format)')%(a,b,...)
里的a,b可以引入变量
数据库查询
- fetchone():获取下一个查询结果集,是一个对象
- fetchall():接受全部的返回结果行
- rowcount:返回执行execute()方法后影响的行数,只读
#前面都不变
sql = """SELECT * FROM EMPLOYEE WHERE AGE > 20"""
#或者sql = "SELECT * FROM EMPLOYEE WHERE AGE > '%d'"%20
try:
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[3]
except:
print("Error:unable to fetch data")
db.close()
数据库更新(更改)
除了sql的操作语句不一样,其他都一样
#前面不变
sql = """UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = "Mac""""
...
except:
db.rollback()
#后面也不变
删除操作
除了sql的操作语句不一样,其他都一样
#前面都不变
sql = """DELETE FROM EMPLOYEE WHERE AGE > 20"""
...
except:
db.rollback()
#后面也不变
rollback()
当调用rollback()方法时,会滚回当前游标的所有操作,也就是撤销所有操作
后记
execute 和 executemany
顾名思义:execute执行一次命令,executemany就是执行多次命令,但还是有区别
execute
cursor.execute("INSERT INTO COUPON(ID,CODE) VALUES(%s,%s)",(1,"afkjdiejh3"))
Param1:sql操作语句
Param2:一个
元组,分别是sql里的变量
注意:我的表中的ID其实为int型,但如果你填写%d或者%i之类的数字类型,你会发现永远会聪(曰)明(DOG)的报错,说需要一个int你却给了一个str(突然脑边环绕一首“削个~椰子皮~你TM却给个梨~”的旋律),所以,不管什么类型,统统是%s,除非你按下面这样写
cursor.execute("INSERT INTO COUPON(ID,CODE) VALUES(%d,%s)&(1,'afkjdiejh3')")
你要是非要这样写,我也拦不住你,看你批量数据怎么办
executemany
cursor.execute("INSERT INTO COUPON(ID,CODE) VALUES(%s,%s)",[(1,"afkjdiejh3"),(2,"fajflsdjfso2")])