python3操作MySQL数据库

这是python3下的MySQL基本操作。其他类型的数据库用法基本一样。就是库的名字不同。因为python官方很早之前就规定了数据库第三方库的借口,来避免API混乱的情况。

安装与准备

这是python3的库,所以windows下安装不会像python2那样各种奇葩VC错误。是比较方便的傻瓜安装。

  • Windows平台下: py -3 -m pip install PyMySQL
  • Linux:python3 pip install PyMySQL

当然,引入的时候:import pymysql


数据库连接对象connection

Function描述
connection创建connection对象
cursor()使用该链接创建+返回游标
commit()提交当前事务
rollback()回滚当前事务
close()关闭连接

介绍一下connection的参数

  1. host mysql服务器地址
  2. port 数字类型 端口
  3. user 用户名
  4. passwd 密码
  5. db 数据库名称
  6. charset 连接编码,需要显式指明编码方式

上一段代码示例:

  1. conn = pymysql.Connect(host= '127.0.0.1',port= 3306,user= 'root',passwd= 'dyx240030',db= 'imooc',charset= 'utf8')
  2. cursor = conn.cursor()
  3. print(conn)
  4. print(cursor)
  5. cursor. close()
  6. conn. close()
  1. OUT:
  2. < pymysql .connections .Connection object at 0 x00000051C15BFDA0>
  3. < pymysql .cursors .Cursor object at 0 x00000051C15BFD68>

数据库游标对象cursor

Function描述
execute(op[,args])执行一个数据库查询和命令
fetchone()取得结果集下一行
fetchmany(size)取得结果集size行
fetchall()取得结果集剩下所有行
rowcount最近一次execute返回数据的行数或影响行数
close()关闭cursor

代码实现:

  1. conn = pymysql.Connect(host= '127.0.0.1',port= 3306,user= 'root',passwd= 'dyx240030',db= 'imooc',charset= 'utf8')
  2. cursor = conn.cursor()
  3. sql = "select * from user"
  4. cursor.execute(sql)
  5. print( "cursor.excute:",cursor.rowcount)
  6. rs = cursor.fetchone()
  7. print( "rs:",rs)
  8. for each in cursor.fetchmany( 2):
  9. print( each)
  10. print()
  11. for each in cursor.fetchall():
  12. print( each)
  1. OUT:
  2. cursor.excute: 4
  3. rs: ( '1', 'name1')
  4. ( '2', 'name2')
  5. ( '3', 'name3')
  6. ( '4', 'name4')

更新数据库insert/update/delete

不同于select操作,这三个操作修改了数据库内容,所以需要commit(),否则数据库没有做相应的更改,但是也不会报错。

按照一般的思路,一般是以下套路:

  1. 关闭自动commit:conn.autocommit(False)
  2. 出现:conn.rowback()回滚
  3. 未出现:conn.commit()

下面这段脚本,实现insert/update/delete操作。其实这种检错模式不对,这里只做简单raise,后面有更好的方法。

  1. conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',passwd='dyx240030',db='imooc',charset='utf8')
  2. conn.autocommit(False)
  3. cursor = conn.cursor()
  4. sqlInsert = " insert into user(userid,username) values( '6', 'name6') "
  5. sqlUpdate = " update user set username= 'name41' where userd= '4' "
  6. sqlDelete = " delete from user where userid= '1' "
  7. try:
  8. cursor.execute(sqlInsert)
  9. print(cursor.rowcount)
  10. cursor.execute(sqlUpdate)
  11. print(cursor.rowcount)
  12. cursor.execute(sqlDelete)
  13. print(cursor.rowcount)
  14. conn.commit()
  15. except Exception as e:
  16. print("Reason: ",e)
  17. conn.rollback()
  18. cursor.close()
  19. cursor.close()
  1. [ OUT]:
  2. 1
  3. Reason: ( 1054, "Unknown column 'userd' in 'where clause'")

实例 银行转账

可以看一下类思想的SQL操作,其中之前提到过的高级报错模式用到了之前看似无用的rowcount函数,通过查看操作对于数据库的影响来检错。

  1. import os
  2. import sys
  3. import pymysql
  4. class transferMoney(object):
  5. def __init__(self,conn):
  6. self.conn = conn
  7. def transfer(self,sourceID,targetID,money):
  8. # 其他函数中若是有错会抛出异常而被检测到。
  9. try:
  10. self.checkIdAvailable(sourceID)
  11. self.checkIdAvailable(targetID)
  12. self.ifEnoughMoney(sourceID,money)
  13. self.reduceMoney(sourceID,money)
  14. self.addMoney(targetID,money)
  15. self.conn.commit()
  16. except Exception as e:
  17. self.conn.rollback()
  18. raise e
  19. def checkIdAvailable(self,ID):
  20. cursor = self.conn.cursor()
  21. try:
  22. sql = "select * from account where id = %d" % ID #select语句判断可以用len(rs)
  23. cursor.execute(sql)
  24. rs= cursor.fetchall()
  25. if len(rs) != 1: # 数据库类思想的报错模式,检查操作对数据库的影响条目。没有达到目标,抛出异常
  26. raise Exception( "账号 %d 不存在"%ID)
  27. finally:
  28. cursor.close()
  29. def ifEnoughMoney(self,ID,money):
  30. cursor = self.conn.cursor()
  31. try:
  32. sql = "select * from account where id = %d and money>=%d" % (ID,money)
  33. cursor.execute(sql)
  34. rs= cursor.fetchall()
  35. if len(rs) != 1:
  36. raise Exception( "账号 %d 不存在 %d Yuan"%(ID,money))
  37. finally:
  38. cursor.close()
  39. def reduceMoney(self,ID,money):
  40. cursor = self.conn.cursor()
  41. try:
  42. sql = "update account set money = money-%d where id=%d"%(money,ID)
  43. cursor.execute(sql)
  44. if cursor.rowcount != 1:
  45. raise Exception( "失败减钱")
  46. finally:
  47. cursor.close()
  48. def addMoney(self,ID,money):
  49. cursor = self.conn.cursor()
  50. try:
  51. sql = "update account set money = money+%d where id=%d"%(money,ID)
  52. cursor.execute(sql)
  53. if cursor.rowcount != 1:
  54. raise Exception( "失败加款")
  55. finally:
  56. cursor.close()
  57. if __name__== "__main__":
  58. if len(sys.argv)>= 2:
  59. sourceID = int(sys.argv[ 1])
  60. targetID = int(sys.argv[ 2])
  61. money = int(sys.argv[ 3])
  62. conn = pymysql.Connect(host= '127.0.0.1',port= 3306,user= 'root',passwd= 'dyx240030',db= 'imooc',charset= 'utf8')
  63. trMoney = transferMoney(conn)
  64. try:
  65. trMoney.transfer(sourceID,targetID,money)
  66. except Exception as e:
  67. print( "出现问题"+str(e))
  68. finally:
  69. conn.close()

我踩过的坑。。。(这里是Python3哦)

'NoneType' object has no attribute 'encoding' ,之前指明的charset必须是"UTF8",不是"utf-8"/"UTF-8"
MySQL语句后面必须有';',否则不会报错,也难以发现
数据库insert/update/delete操作需要commit()
在构造命令的时候,注意用 " 包裹起来,因为SQL语句字符串需要 ' 包裹。所以," 比较简单的避免歧义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值