使用Python访问MySql数据库

一、 使用Python访问MySql数据库
1、 安装pymysql
2、 连接数据库,获取连接对象
3、 通过连接对象获取游标对象
4、 通过游标对象执行sql语句
5、 获取查询结果
6、 关闭游标

二、 连接步骤
1、 安装pymysql的数据库访问组件

2、 连接数据库获取游标对象

1获取连接对象

conn=pymysql.connect("localhost","root","java","studb")
print(type(conn))

2通过链接对象获取游标对象

cursor=conn.cursor()
print(type(cursor))

3、 执行增加修改删除操作

3执行sql

sql="INSERT INTO student(sname,sex,address,birthday,classid) VALUES('张飞','男','北京','1998-12-11',1)"

将传递的参数使用%s进行占位

sql="INSERT INTO student(sname,sex,address,birthday,classid) VALUES(%s,%s,%s,%s,%s)"

try:
cursor.execute(sql,('司马昭','男','长沙','1997-12-11','4'))
print("执行成功",cursor.rowcount)
conn.commit()#提交事务
except:
print("执行失败!")
finally:
conn.close()
Demo2.py
import pymysql#引入数据库组件

1获取连接对象

conn=pymysql.connect("localhost","root","java","studb")
print(type(conn))

2通过链接对象获取游标对象

cursor=conn.cursor()
print(type(cursor))

3执行sql

将传递的参数使用%s进行占位

sql="update student set sname=%s,sex=%s,address=%s,birthday=%s,classid=%s where sid=%s"

try:
cursor.execute(sql,('姜维','男','天水郡','1997-12-11','4','6'))
print("执行成功",cursor.rowcount)
conn.commit()#提交事务
except:
print("执行失败!")
finally:
conn.close()

Demo3.py
import pymysql#引入数据库组件

1获取连接对象

conn=pymysql.connect("localhost","root","java","studb")
print(type(conn))

2通过链接对象获取游标对象

cursor=conn.cursor()
print(type(cursor))

3执行sql

将传递的参数使用%s进行占位

sql="delete from student where sid=%s"

try:
cursor.execute(sql,('6'))
print("执行成功",cursor.rowcount)
conn.commit()#提交事务
except:
print("执行失败!")

4、 获取结果集对象

import pymysql#引入数据库组件

1获取连接对象

conn=pymysql.connect("localhost","root","java","studb")
print(type(conn))

2通过链接对象获取游标对象

cursor=conn.cursor()
print(type(cursor))

3执行sql

sql="select * from student"

try:
cursor.execute(sql)
print("执行成功",cursor.rowcount)
rst=cursor.fetchall()
print(type(rst))
#print(rst)
for row in rst:#从集合中获取记录
for i in range(0,6):#从记录中获取列值
print(row[i])#获取列值
print("=======================")
except:
print("执行失败!")

5、 将结果封装在学生的对象集合中
(1) 创建学生类student.py

class Student(object):
sid=0;
sname="无名氏"
sex="男"
address="未知"
birthday="1995-01-01"
classid="1"

def Student(self,sname,sex,address,sdate,cid):
    self.sname=sname
    self.sex=sex
    self.address=address
    self.birthday=sdate
    self.classid=cid

(2) 将结果及数据转为学生集合

import pymysql#引入数据库组件
from com.bean.student import Student #从com.bean.student文件中引入Student类

1获取连接对象

conn=pymysql.connect("localhost","root","java","studb")
print(type(conn))

2通过链接对象获取游标对象

cursor=conn.cursor()
print(type(cursor))

3执行sql

sql="select * from student"

try:
cursor.execute(sql)
print("执行成功",cursor.rowcount)
rst=cursor.fetchall()
print(type(rst))
lsst=[]#准备学生数组
#print(rst)
######封装学生数据到集合######################################
for row in rst:#从集合中获取记录
# 将表的字段值设置到学生对象中
st=Student()
st.sid=row[0]
st.sname = row[1]
st.sex = row[2]
st.address = row[3]
st.birthday = row[4]
st.classid = row[5]
#################################
lsst.append(st)#将学生对象设置到集合
##############################################################
for st in lsst:
print(st.sid,"\t",st.sname,"\t",st.sex,
"\t",st.address,"\t",st.birthday,"\t",st.classid)
print("=============================================")

print(lsst)

except:
print("执行失败!")

6、 编写数据库执行的工具类dbutil.py,处理数据库连接和各种sql语句

import pymysql # 引入数据库组件
class DbUtile(object):

#编写通用的sql的增删改方法
def executeUpdate(sql,parms):
    print(sql)
    print(parms)
    # 1获取连接对象
    conn = pymysql.connect("localhost", "root", "java", "studb")
    print(type(conn))

    # 2通过链接对象获取游标对象
    cursor = conn.cursor()
    print(type(cursor))
    try:
        if parms !=None and len(parms)>0:
            cursor.execute(sql,parms)
            conn.commit()#提交数据
            return cursor.rowcount #返回受影响的行数
        else:
            cursor.execute(sql)
            conn.commit()  # 提交数据
            return cursor.rowcount  # 返回受影响的行数
    except:

        return -1
    finally:
        conn.close()

#编写查询的方法
def excuteQuery(sql,parms):
    # 1获取连接对象
    conn = pymysql.connect("localhost", "root", "java", "studb")
    print(type(conn))

    # 2通过链接对象获取游标对象
    cursor = conn.cursor()
    print(type(cursor))
    try:
        if parms != None and len(parms) > 0:
            print("==有参数===")
            cursor.execute(sql, parms)
            rst=cursor.fetchall()

            return  rst# 返回结果集合
        else:
            print("====无参===")
            cursor.execute(sql)
            rst = cursor.fetchall()
            return rst  # 返回结果集合

    except:
        print("异常")
        return None

三、 项目实践,分层构建学生管理系统
1、 构建学生类student.py

class Student(object):
sid=0;
sname="无名氏"
sex="男"
address="未知"
birthday="1995-01-01"
classid="1"
cname="java1班"

def Student(self,sid,sname,sex,address,sdate,cid,cname):
    self.sid=sid
    self.sname=sname
    self.sex=sex
    self.address=address
    self.birthday=sdate
    self.classid=cid
    self.cname=cname

2、 构建通用数据处理类DBUtil.py

import pymysql # 引入数据库组件
class DbUtile(object):

#编写通用的sql的增删改方法
def executeUpdate(sql,parms):
    print(sql)
    print(parms)
    # 1获取连接对象
    conn = pymysql.connect("localhost", "root", "java", "studb")
    print(type(conn))

    # 2通过链接对象获取游标对象
    cursor = conn.cursor()
    print(type(cursor))
    try:
        if parms !=None and len(parms)>0:
            cursor.execute(sql,parms)
            conn.commit()#提交数据
            return cursor.rowcount #返回受影响的行数
        else:
            cursor.execute(sql)
            conn.commit()  # 提交数据
            return cursor.rowcount  # 返回受影响的行数
    except Exception as e:
        print(e)
        return -1
    finally:
        conn.close()

#编写查询的方法
def excuteQuery(sql,parms):
    # 1获取连接对象
    conn = pymysql.connect("localhost", "root", "java", "studb")
    print(type(conn))

    # 2通过链接对象获取游标对象
    cursor = conn.cursor()
    print(type(cursor))
    try:
        if parms != None and len(parms) > 0:
            print("==有参数===")
            cursor.execute(sql, parms)
            rst=cursor.fetchall()

            return  rst# 返回结果集合
        else:
            print("====无参===")
            cursor.execute(sql)
            rst = cursor.fetchall()
            return rst  # 返回结果集合

    except:
        print("异常")
        return None

3、 构建数据访问对象类studao.py,操作sql

from com.util.dbutil import DbUtile
from com.bean.student import Student
class StudentDao:
#保存的方法
def save(self,stu):
sql="INSERT INTO student(sname,sex,address,birthday,classid) VALUES(%s,%s,%s,%s,%s)";
stupair=(stu.sname,stu.sex,stu.address,stu.birthday,stu.classid)
row=DbUtile.executeUpdate(sql,stupair) #获取受到影响的行数
return row
#更新的方法
def update(self,stu):
sql="update student set sname=%s,sex=%s,address=%s,birthday=%s,classid=%s where sid=%s"
stupair = (stu.sname, stu.sex, stu.address, stu.birthday, stu.classid,stu.sid)
row = DbUtile.executeUpdate(sql, stupair)
return row

#删除的方法,根据编号删除
def delete(self,sid):
    sql = "delete from student  where sid=%s"
    stupair=(sid)
    row = DbUtile.executeUpdate(sql, stupair)
    return row

#根据编号查找学生信息
def findById(self,sid):
    sql="select s.*,c.cname from student s,clazz c where s.classid=c.cid and sid=%s";
    stupair = (sid)
    rst=DbUtile.excuteQuery(sql,stupair)
    for rs in rst:
        stu=Student()
        stu.sid=rs[0]
        stu.sname=rs[1]
        stu.sex=rs[2]
        stu.address=rs[3]
        stu.birthday=rs[4]
        stu.classid=rs[5]
        stu.cname=rs[6]
        return stu

#查找所有的学生信息
def findAll(self):
    sql="select s.*,c.cname from student s,clazz c where s.classid=c.cid and 1=1 order by sid"
    rst = DbUtile.excuteQuery(sql, None)
    lsst=[];
    for rs in rst:
        stu=Student()
        stu = Student()
        stu.sid = rs[0]
        stu.sname = rs[1]
        stu.sex = rs[2]
        stu.address = rs[3]
        stu.birthday = rs[4]
        stu.classid = rs[5]
        stu.cname = rs[6]

        lsst.append(stu)

    return lsst#返回学生集合

4、 构建业务类stubiz.py

from com.bean.student import Student
from com.dao.StudentDao import StudentDao

class StudentBiz:

def save(self,stu):
    sdao = StudentDao()
    row=sdao.save(stu)
    if row>0:
        print("保存成功!")
    else:
        print("保存失败!")

def update(self,stu):
    sdao = StudentDao()
    row = sdao.update(stu)
    if row > 0:
        print("更新成功!")
    else:
        print("更新失败!")

def delById(self,sid):
    sdao = StudentDao()
    row = sdao.delete(sid)
    if row > 0:
        print("删除成功!")
    else:
        print("删除失败!")

def findById(self,sid):
    sdao = StudentDao()
    stu=sdao.findById(sid)
    print("编号\t姓名\t性别\t地址\t生日\t班级")
    print("========================================================")
    print(stu.sid,"\t",stu.sname,"\t",stu.sex,"\t",stu.address,"\t",stu.birthday,"\t",stu.cname)
    print("========================================================")

def findAll(self):
    sdao = StudentDao()
    lsst=sdao.findAll()
    print("编号\t姓名\t性别\t地址\t生日\t班级")
    for stu in lsst:
        print(stu.sid, "\t", stu.sname, "\t", stu.sex, "\t", stu.address, "\t", stu.birthday, "\t", stu.cname)
    print("========================================================")

5、 构建交互动作类studentAction.py

from com.bean.student import Student
from com.biz.StudentBiz import StudentBiz

class StudentAction:
#定义录入学生信息的方法
def inputStuInfo(self):
stu = Student()
print("输入学生姓名")
stu.sname=input()

    print("输入学生性别")
    stu.sex = input()

    print("输入学生地址")
    stu.address = input()

    print("输入学生生日")
    stu.birthday = input()

    print("输入学生班级编号")
    stu.classid = input()

    return stu

def showMenu(self):
    stubiz=StudentBiz()
    while True:
        print("===学生信息管理===")
        print("1--添加")
        print("2--修改")
        print("3--删除")
        print("4--查找")
        print("5--显示")
        print("0--退出")
        print("===================")
        print("请输入您的选择0-5之间的数字:")
        code=input()
        op=int(code)
        if op==1:#添加
            stu=self.inputStuInfo()
            stubiz.save(stu)
        if op==2:#修改
            stu=self.inputStuInfo()
            print("请输入学生编号:")
            sid=input()
            stu.sid=sid;
            stubiz.update(stu)
        if op==3:
             print("请输入学生编号:")
             sid = input()
             stubiz.delById(sid)

        if op==4:
            print("请输入学生编号:")
            sid = input()
            stubiz.findById(sid)

        if op==5:
            stubiz.findAll()
        if op==0:
            print("系统结束,谢谢使用!")
            break;

if name == '__main__':
stuaction=StudentAction()
stuaction.showMenu()

项目的结构如下:

注意:(1)按照顺序和层次结构进行构建
(2)注意方法的编写规范

评论