PyMySQL——python操作数据库

摘自: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")])
Param1:sql操作语句
Param2:包含多个元组的数组,每个元组里分别是sql里的变量
注意(Again!):变量类型都写%s,不然就是作死了……

你可能感兴趣的:(数据库)