鱼C论坛

 找回密码
 立即注册
查看: 2064|回复: 4

MySQL的问题

[复制链接]
发表于 2017-7-15 00:41:23 | 显示全部楼层 |阅读模式
10鱼币
用过MySQL的人都知道,在操作表格之前要获取一个游标cursor
然后操作完成之后(即使操作失败,一般会用try..finally)也会关闭游标和链接
例如
  1.     try:
  2.         # 将字符串用双引号来括起来,避免字符串中带有单引号使程序报错
  3.         cursor.execute(sql语句)
  4.         conn.commit()
  5.     except Exception as e:
  6.         print('写入数据失败:',e)
  7.     finally:
  8.         cursor.close()
  9.         conn.close()
复制代码

那么问题来了,我将上面这个写成一个插入数据的函数,
现在我要插入1条数据的话,很简单,按照上面的操作就行
那我如果要插入很多条数据呢?
有2中做法:
1,每次插入数据都重复(链接数据表-获取游标-执行SQL语句保存数据-关闭游标和链接)
2,把链接数据表放在一个类里面,链接数据表得到游标----使用循环保存数据---最后等所有数据都执行完毕后关闭游标和链接

上述2中方法其实都是可行的,2看起来好像比较符合python类的写法,但是,我对于2 的问题比较大,就是保存数据并不是每次都会成功的,一旦中间有失败,就无法执行最后的关闭游标,那前面的数据还会安全 的保存么?

其实我本来想用2 来写的,但是不知道这样对数据安全不,所以目前还是用的1方法

对数据不熟,求解答

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-15 10:10:27 | 显示全部楼层
自定义一个类,重写__enter__和__exit__方法,然后就可以用with语句来控制数据库关闭了。其实就是方法一了。enter里面应该是connect,exit里面是close。然后在with代码块下面做循环,也就是方法二。这样是不是一举两得?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-15 12:14:21 | 显示全部楼层
同意楼上,用with方法是比较好的

例:
  1. class SqlManager(object):
  2.     """方便的上下文管理,返回游标。"""
  3.     def __init__(self, dbName, isolation_level=True):

  4.         self.dbName = dbName
  5.         self.isolation_level = isolation_level

  6.     def __enter__(self):
  7.         self.db = connectSql(self.dbName)
  8.         self.cursor = getCursor(self.db)

  9.         return self.cursor

  10.     def __exit__(self, except_type, value, tb):

  11.         commitAndClose(self.db, self.cursor)

  12.         return True
复制代码


__exit__方法只要返回是True,那么中间的语句出现错误不会报错,程序可以继续运行(将不再运行with语句内的内容)。

还有就是可以继承那个类,重写execute这个方法。加个错误判断即可过滤错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-15 12:38:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-15 12:57:20 | 显示全部楼层
本帖最后由 gopythoner 于 2017-7-15 12:58 编辑
wei_Y 发表于 2017-7-15 12:14
同意楼上,用with方法是比较好的

例:


我用了我说的第二种方法
因为在执行语句的时候我用的也是try语句,只有在能执行的时候才提交更改,也就是conn.commit()
否则就回滚一下conn.rollback(),有回滚操作对于数据的安全性就比较好了
在循环执行完所以操作之后,最后定义一个函数关闭游标和连接
感觉这样子也挺不错的

我纠结于1,2种方法主要是怕第一种方法会拖慢速度,因为第一种每次修改一个条数据都要重新连接一次数据和关闭一次,我以为会很慢,但是看了执行时间发现2种方法的速度并看不出来有明显的差异
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表