通过Python操作MySql数据库

前言:

我们来学习一下通过python语言操作mysql数据库

 

 

 

 


Connection、Cursor两大对象:

在python连接Mysql数据库的话题里,最绕不开的就是这两大对象。

正如网上很多人的比喻一样,Connection就好比高速公路(建立了连接),Cursor就好比路上的汽车(传达了数据)

Connection(host,port,user,passwd,db,charset)
host:MySql服务器地址
port:MySql服务器端口
user:用户名
passwd:密码
db:数据库名称
charset:连接编码

使用Connection后会返回一个connection对象,它支持这些方法

cursor()   //使用该连接创造并返回游标
begin()     //开启一个事务
commit()   //提交当前事务
rollback()     //回滚当前事务
close()       //关闭连接

建立连接后我们就使用cursor来进行操作,cursor对象支持的方法:

execute(sql[,args])       //执行一个数据库查询和命令
execute(sql,args)       //执行多个数据库查询和命令
fetchone()           //取得结果集的下一行
fetchmany(size)  //获取结果集的下size行
fetchall()         //获取结果集中剩下的所有行
close()              //关闭游标对象
rowcount        //最近一次execute返回数据的行数或影响行数

事务:

在对数据库的操作中,存在一个事务的概念:

事务:访问和更新数据库的一个程序执行单元,主要用于处理操作量大,复杂度高的数据

一般来说,事务具有四个性质

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在MySql中,事务的提交是一个自动的事情,即每一次执行SQL语句都会进行一次提交,这并不利于我们开发。

所以我们要手动的关闭事务的自动提交:设置conn.autocommit(False),或者显示的主动开启事务(利用begin())。

在要结束事务时,分为两种情况:

  • 正常结束:commit()          进行提交
  • 异常结束:rollback()         回滚操作

 


代码示例:

这里我使用pycharm来进行这个实验,首先我们需要安装pymysql

文件→设置→项目→Project Interpreter

双击右边的pip

选择pyMySQL下载

下边显示 安装成功即可!

 


我的安装并没有成功,由于版本的问题,出现了一个意外情况:

如果你也出现了这个问题,请这样操作,打开提示路径,修改两个方法:

def do_install(pkgs):
    #try:
    #    import pip
    #except ImportError:
    #    error_no_pip()
    #return pip.main(['install'] + pkgs)
    try:
        try:
            from pip._internal import main
        except Exception:
            from pip import main
    except ImportError:
        error_no_pip()
    return main(['install'] + pkgs)

def do_uninstall(pkgs):
    #try:
    #    import pip
    #except ImportError:
    #    error_no_pip()
    #return pip.main(['uninstall', '-y'] + pkgs)
    try:
        try:
            from pip._internal import main
        except Exception:
            from pip import main
    except ImportError:
        error_no_pip()
    return main(['uninstall', '-y'] + pkgs)

再重新在pyCharm中安装即可


而mysql这边我使用Workbench来操作

在本机启动数据库服务,新建一个数据库(SCHEMAS)

打开pycharm,输入代码建立连接,并且创建游标:

import pymysql
#连接数据库
db=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',database='blog')
#创建一个游标
cursor=db.cursor()

我的数据库名就是“blog”

接下来执行sql操作

建表:

#sql语句
sql='''create table hero(
id int not null PRIMARY  key auto_increment,
name char(20) unique,
age int,
info varchar(100)
)'''
#执行sql语句
cursor.execute(sql)

插入:

#sql语句
sql="insert into hero(name,age,info) VALUES('钢铁侠',22,'有钱')"
db.begin()       #开启事务
try:
    #执行sql语句
    cursor.execute(sql)
    #提交事务
    db.commit()
except pymysql.Error as e:
    print(e)
    db.rollback()   #报错,则回滚
db.close()

遍历:

#sql语句
sql="select * from hero"
db.begin()       #开启事务
try:
    #执行sql语句
    cursor.execute(sql)
    #取得全部内容(元组方式存储)
    result=cursor.fetchall()
    #利用循环打印
    for ahero in result:
        id = ahero[0]
        name = ahero[1]
        age = ahero[2]
        info = ahero[3]
        print("id="+str(id)+"name="+name+"age="+str(age)+"info="+info)
    #提交事务
    db.commit()
except pymysql.Error as e:
    print(e)
    db.rollback()   #报错,则回滚
db.close()

id=1name=钢铁侠age=22info=有钱
id=3name=张伟age=25info=穷鬼
id=4name=张婉莹age=21info=可爱
id=5name=李胜age=31info=凶恶

删除:

#sql语句
sql="delete from hero where id=1"
db.begin()       #开启事务
try:
    #执行sql语句
    cursor.execute(sql)
    #提交事务
    db.commit()
except pymysql.Error as e:
    print(e)
    db.rollback()   #报错,则回滚
db.close()

删除了id=1的数据行

查找:

#sql语句
sql=r"select * from hero WHERE name='李胜'"
db.begin() #开启事务
try:
    #执行sql语句
    cursor.execute(sql)
    s=cursor.fetchall()
    print(s)
    db.commit()     #提交事务
except pymysql.Error as e:
    print(e)
    db.rollback()     #报错,则回滚
db.close()

((5, ‘李胜’, 31, ‘凶恶’),)

交互后查找:

#输入字符串
name=input("请输入你要找的人")
#sql语句
sql="select * from hero WHERE name=%s"
db.begin() #开启事务
#定义标志物
res=None
try:
    #执行sql语句 (第二个参数即把占位符解释)
    cursor.execute(sql,name)
    res=cursor.fetchall()
    if res:   #若res有元素
        res=res[0]   #返回是个元组,我们取第一层
    db.commit() #提交事务
except pymysql.Error as e:
    print(e)
    db.rollback() #报错,则回滚
db.close()
if res:
    print("找到了:"+str(res[0])+" "+res[1]+" "+str(res[2])+" "+res[3])
else:
    print("查无此人!")

测试结果非常完美!

这里,我们在sql语句中使用了占位符(%s:占位字符串数字都可以)

在execute中传入参数解释了占位符,实现了查找

更新:

#sql语句
sql="UPDATE hero SET name='菇凉' WHERE name='李胜'"
#开始事务
db.begin()
#异常处理
try:
    #执行SQL语句
    cursor.execute(sql)
    #提交事务
    db.commit()
except pymysql.Error as e:
    print (e)
    #回滚
    db.rollback()
#关闭连接
db.close()

 

 


有关python对MySQL数据库的操作就先到这里了,写文章不容易,给个赞吧

 

 

 

 

 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处

 

发表评论