求助python操作mysql问题,运行过一段时间,就不显示好象没有执行一样。程序代码如下。

python同步微信群信息并且将所要信息采集到mysql数据库。程序运行一段时间,有可能是一个早上,也有可能是几分钟。即不报错,也没打印信息。。非常奇怪

我原来以为是mysql的8小时链接限制,所以我把数据库做到本地和远程数据库分别做了测试,是一样的,过段时间就会不显示,象哑了一样。

关键代码如下,打印过save_info_mysql中所有参数,不过程序是不是正常还是没有显示的时候,参数都是正确传入无误的,所以错的关键是以下save_info_mysql函数。还求大神指点

保存数据到数据库

def save_info_mysql(d, village, price, area, telphone, telphone2):
stime = datetime.datetime.fromtimestamp(d['CreateTime'])
mycursor = mdb.cursor()
Content = sub_telphone(d)
sql1 = "select * from log where content = '%s'" % (Content)
print(sql1) #这句打印可以执行,并且显示
result = mycursor.execute(sql1)
print(result) #这句程序开始运行的时候会显示0或1,运行过一段时间就不打印了,好象是没有执行这句,包括后面的IF else都是没有执行的。就象程序运行在这里就中断了,然后重新开始循环一样。
if result:
print(Content + "数据已经存在")

return
else:
sql = '''INSERT INTO log (wxname,content,stime,village,price,area,telphone6,telphone11,istj) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')''' % (
d['ActualNickName'], Content, str(stime), village, price, area, telphone, telphone2, 0)
mycursor.execute(sql)
mdb.commit()
group = itchat.get_chatrooms(update=True)
for g in range(0,len(group)):
if group[g]['NickName'] in groups:
print(group[g]['NickName'])
itchat.send(Content, group[g]['UserName'])
print(Content + '写入数据')
time.sleep(1)

4个回答

你这个函数 是单线程还是多线程?是不是“sql1 = "select * from log where content = '%s'" % (Content)
print(sql1) #这句打印可以执行,并且显示
result = mycursor.execute(sql1) 这一句执行的时候 卡住了?” 比如你多个线程同时执行这一句可能会有问题 ,如果 这样需要加锁

bob952
bob952 虽然没有解决,但谢谢你的热心
12 个月之前 回复
bob952
bob952 回复xingjianfengaa: 刚刚测试了一下,我在select 和 insert 两个数据库操作部分都加了锁,仍旧一样问题。非常困惑
12 个月之前 回复
xingjianfengaa
xingjianfengaa 回复: 不看代码的话 你可以在界面或什么地方 同时批量触发你的这个功能 使它大量插入数据 看看是不是更容易卡住,用这个来看是不是这个地方的问题
12 个月之前 回复
xingjianfengaa
xingjianfengaa 回复bob952: 那你把insert部分注释掉再去跑,看看还会不会卡,我怀疑是多线程,同时insert引起的,如果是单线程,那问题就明显不一样了,解决方案另说,你确认下代码吧
12 个月之前 回复
bob952
bob952 回复xingjianfengaa: 谢谢耐心回复,我对线程不太了解,我的代码对数据库的操作就是这个函数,其它部分的就是对PHP页POST获取JSON数据,PHP页用的数据也是同一个数据。主要是查询数据用的,就是我贴出来这部分功能出现卡住现象,那块查询功能还是正常的并不受影响。这样子应该是单线程的吧
12 个月之前 回复
xingjianfengaa
xingjianfengaa 回复bob952: 锁 就比如你的银行卡和支付宝,一边用银行卡ATM提款,一边支付宝转账,我说的是同时,如果没锁,可能银行就只扣你一次钱,加上锁是一个扣钱另一个先等着,就像你的函数,一个线程正在查询或插入另一个等一下先,等到锁结束,立马再次插入或查询,一般查询是不用加锁的就是插入或更新 修改时才会导致问题的出现
12 个月之前 回复
xingjianfengaa
xingjianfengaa 回复bob952: Mylock = threading.Lock() 全局 if Mylock.acquire(): "你的函数代码"Mylock.release(),就加在函数return 时一定要Mylock.release()
12 个月之前 回复
bob952
bob952 回复xingjianfengaa: 查看了一下加锁,好复杂,我是小白,求指点
12 个月之前 回复
bob952
bob952 对的,就是这句就卡住,往下就不执行了
12 个月之前 回复
xingjianfengaa
xingjianfengaa 像这种开始正常 过一段时间 出什么问题,随机性的,一般和线程有关
12 个月之前 回复
bob952
bob952 我也想是否远程服务器拒绝访问,所以在本机也测试过,会出现一样情况。 代码中也有time.sleep(1)
12 个月之前 回复

查询的结果不是result = mycursor.execute(sql1)
修改为:

mycursor = mdb.cursor()
Content = sub_telphone(d)
sql1 = "select * from log where content = '%s'" % (Content)
print(sql1) #这句打印可以执行,并且显示
mycursor.execute(sql1)
result=mycursor.fetchall()
print(result) 

保存数据到数据库
def save_info_mysql(d, village, price, area, telphone, telphone2):
lock.acquire() #加锁
stime = datetime.datetime.fromtimestamp(d['CreateTime'])
mycursor = mdb.cursor()
Content = sub_telphone(d)
sql1 = "select * from log where content = '%s'" % (Content)
print(sql1)
result = mycursor.execute(sql1)
lock.release() #释放锁
time.sleep(1)
print(result)
if result:
print(Content + "数据已经存在")
return
else:
lock.acquire() #加锁
sql = '''INSERT INTO log (wxname,content,stime,village,price,area,telphone6,telphone11,istj) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')''' % (
d['ActualNickName'], Content, str(stime), village, price, area, telphone, telphone2, 0)
mycursor.execute(sql)
mdb.commit()
lock.release()#释放锁
group = itchat.get_chatrooms(update=True)
for g in range(len(group)):
if group[g]['NickName'] in groups:
itchat.send(Content, group[g]['UserName'])
time.sleep(1)
print(Content + '写入数据')
mdb.close()

bob952
bob952 代码加上锁后,还是一样的运行结果,随机性的不执行mycursor.execute(sql1)后的代码
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!