我是靠谱客的博主 积极饼干,最近开发中收集的这篇文章主要介绍pymysql连接mysql数据库try_使用pyMySQL连接数据库时遇到的几个问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近几天在折腾MySQL,遇到几个问题,整理一下,环境为python3.4,没有mysqldb,只好用pymysql。

1、使用with pymysql.connect() 语句时,返回的对象是cursor类型,不是connection类型,需要注意一下。

2、想要实现向数据库中添加记录时记录已存在则更新记录的功能,一开始考虑用on duplicate key update语句,但这样产生了一个新的问题,就是这样会导致自增长的主键不连续。产生的原因是因为表锁的机制问题。因为在执行该语句前无法确定是否需要插入新行。这种情况下MySQL默认的做法是先申请一个位置,若是执行insert操作的话就不会有问题,若执行update操作则这个位置就空下了,由此导致自增字段不连续。

有一种解决方法是设置innodb_autoinc_lock_mode=0,但这样可能会在并发插入时出现问题,虽然我的小数据库只有自己在用,为了学习起见还是换个方法……更详细的解释看这里

3、为了让自增长字段连续,最好采用simple insert的方式插入,因此需要用到存储过程来对记录是否存在做判定。

with pymysql.connect(**self.login) as cursor:

info = self.recentMatch()

for i in info:

arg = (ins[0], ins[1], ins[2])

cursor.callproc('updaterecentmatch', arg)

但是执行上述代码时,会报错

网上查了下原因:

首先,参见1,cursor是cursor类型而非connection类型。

其次,在调用存储过程之后需要执行mysql_store_result()来从服务端取回结果,在python中是在创建cursor时执行该操作,调用完一次存储过程以后未清理,因此会报错。

由此在循环尾部添加cursor.nextset()或者放弃with,手动创建connection,然后将cursor放到for循环里面。

try:

conn = pymysql.connect(**self.login)

info = self.recentMatch()

for i in info:

cursor = conn.cursor()

ins = list(i)

arg = (ins[0], ins[1], ins[2])

cursor.callproc('updaterecentmatch', arg)

cursor.close()

except Exception as e:

print(e)

finally:

conn.close()

# with pymysql.connect(**self.login) as cursor:

# info = self.recentMatch()

# for i in info:

# ins = list(i)

# arg = (ins[0], ins[1], ins[2])

# cursor.callproc('updaterecentmatch', arg)

# while cursor.nextset() is not None:

# pass

参考:

最后

以上就是积极饼干为你收集整理的pymysql连接mysql数据库try_使用pyMySQL连接数据库时遇到的几个问题的全部内容,希望文章能够帮你解决pymysql连接mysql数据库try_使用pyMySQL连接数据库时遇到的几个问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部