鱼C论坛

 找回密码
 立即注册
查看: 9017|回复: 21

[已解决]Python查询数据库执行数据处理后抛异常

[复制链接]
发表于 2016-7-21 23:13:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在数据库中剪建了表,插入了大量的日志数据,然后用Python写了脚本读取里面的数据进行了相关处理,然后将处理完的数据插入回另一张表中,写了个循环每次读取10条,处理完插入数据库,程序跑起来后去到9W条左右就出现报错,,,,如下
Traceback (most recent call last):
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 112, in execute
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 230, in _query
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 607, in query
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 691, in

_read_query_result
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 873, in read
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 880, in

_read_ok_packet
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 292, in

read_length_coded_binary
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 161, in unpack_int24
TypeError: a bytes-like object is required, not 'int'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./888.py", line 113, in <module>
    cursor1.execute(sql2)
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 117, in execute
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/connections.py", line 187, in

defaulterrorhandler
pymysql.err.Error: (<class 'TypeError'>, TypeError("a bytes-like object is required, not 'int'",))
Exception ignored in: <bound method Cursor.__del__ of <pymysql.cursors.Cursor object at 0x7f94c9cdd748>>
Traceback (most recent call last):
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 41, in __del__
  File "/usr/local/python3b/python3.5/site-packages/PyMySQL3-0.5-py3.5.egg/pymysql/cursors.py", line 47, in close
ReferenceError: weakly-referenced object no longer exists
最佳答案
2016-7-21 23:49:50
本帖最后由 SixPy 于 2016-7-22 00:30 编辑

weakly-referenced object no longer exists

弱引用对象不存在

cursor1.close()  cursor关闭早了~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-21 23:14:21 | 显示全部楼层
无奈折腾了整整一天,老大问我怎么样了,我都不知道怎么说好了,,,,,鱼友们对于这种错误有没有遇到过???或者有木有思路怎么处理???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-21 23:19:50 | 显示全部楼层
贴上一下白菜的代码,,,,不管能不能解决,希望留下点意见,,,,一个人的视野太窄了
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import pymysql
import re
import requests
import json
import time

#ptn = r'\d??(\d{4}-\d\d-\d\d).*(\d\d:\d\d:\d\d).*(\d{10}\.\d{3}).*(\s\d+\.\d+\.\d+\.\d+\s).*(www.*?[.com||.com.cn||.com.hk])[/||\s]'
ptn = r'\d??(\d{4}-\d\d-\d\d).*(\d\d:\d\d:\d\d).*(\d{10}\.\d{3}).*(\s\d+\.\d+\.\d+\.\d+\s).*://([^/]*)/'
rcdn = r'(\d+)\s+(GET|POST|PUT|CONNECT|HEAD|NONE)'
rurl =r'"(http[^ ]*)"'
conn1= pymysql.connect("192.168.4.127","root","syslog_ng321","ceshi",charset="utf8")
cursor1 = conn1.cursor()
sid=1
eid=10
while 1:
        sql1 = "select * from logs where id between %d and %d"%(sid,eid)
        print(sid)
        print(eid)
        sid=eid+1
        eid+=10
        cursor1.execute(sql1)
        rs=cursor1.fetchall()
        for line in rs:
                line=[str(i) for i in line]
                line=''.join(line)
                a=re.search(rurl,line)
                if a:
                        urla=a.group(0).replace('"','')
                        urlb=urla.replace("\\","")
                        s=re.findall(ptn,line)
                        cdn=re.findall(rcdn,line)
                        #文件类型
                        if 'text/html' in line:
                                file_type=['text/html']
                        elif 'text/css' in line:
                                file_type=['text/css']
                        elif 'image/jpeg' in line:
                                file_type=['image/jpeg']
                        elif 'text/plain' in line:
                                file_type=['text/plain']
                        elif 'application/javascript' in line:
                                file_type=['application/javascript']
                        else:
                                file_type=['other']
                        #CDN带宽,回源带宽
                        if 'NONE' in line:
                                cdn_andwidth=cdn[0][0]
                                host_andwidth='0'
                        else:
                                cdn_andwidth='0'
                                host_andwidth=cdn[0][0]
                        #OS操作系统
                        if 'Windows' in line:
                                os=['windows']
                        elif 'Mac' in line:
                                os=['mac']
                        elif 'Android' in line:
                                os=['android']
                        elif 'BlackBerry' in line:
                                os=['BlackBerry']
                        elif 'Ubuntu' in line:
                                os=['ubuntu']
                        else:
                                os=['other']
                        #pv请求
                        if 'html' in line:
                                pv=['1']
                        else:
                                pv=['0']
                        #browser浏览器
                        if 'Mac' in line and 'Safari' in line:
                                browser=['Safari']
                        elif 'Mac' in line and 'MicroMessenger' in line:
                                browser=['MicroMessenger']
                        elif 'Mac' in line and 'UCBrowser' in line:
                                browser=['UCBrowser']
                        elif 'Windows'in line and 'Chrome' in line:
                                browser=['Chrome']
                        elif 'Windows'in line  and 'QQBrowser' in line:
                                browser=['QQBrowser']
                        elif 'Windows'in line  and 'Firefox' in line:
                                browser=['Firefox']
                        elif 'Windows'in line and 'MSIE' in line:
                                browser=['MSIE']
                        elif 'Android'in line and 'UCBrowser' in line:
                                browser=['UCBrowser']
                        elif 'Android'in line and 'Chrome' in line:
                                browser=['Chrome']
                        elif 'Android'in line and 'MQQBrowser' in line:
                                browser=['MQQBrowser']
                        elif 'Windows' not in line and 'Mac' not in line and 'Android' not in line and 'Firefox' in line:
                                browser=['Firefox']
                        elif 'Windows' not in line and 'Mac' not in line and 'Android' not in line and 'BaiduBrowser' in line:
                                browser=['BaiduBrowser']
                        else:
                                browser=['other']
                        sql2 ='insert into cdn_logs (data,time_while,time_stamp,ip,domain,OS,pv,browser,cdn_andwidth,host_andwidth,file_type,url) values("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")'%(s[0][0],s[0][1],s[0][2],s[0][3],
s[0][4],os[0],pv[0],browser[0],cdn_andwidth,host_andwidth,file_type[0],urlb)
                        print(sql2)
                        time.sleep(0.05)
                        cursor1.execute(sql2)
cursor1.close()
conn1.commit()
conn2.close()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-21 23:49:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 SixPy 于 2016-7-22 00:30 编辑

weakly-referenced object no longer exists

弱引用对象不存在

cursor1.close()  cursor关闭早了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 08:32:53 | 显示全部楼层
SixPy 发表于 2016-7-21 23:49
weakly-referenced object no longer exists

弱引用对象不存在

您的意思是说cursor1.close(),关闭了,导致这个错误??
但是我前面加了个while循环,在数据查询读取之间不断循环,这样cursor1.close()好像不会被执行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 08:55:07 | 显示全部楼层
liangmanxing 发表于 2016-7-22 08:32
您的意思是说cursor1.close(),关闭了,导致这个错误??
但是我前面加了个while循环,在数据查询读取之 ...

你看一下 cdn_logs 里有没有 之前插入的数据~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 09:03:48 | 显示全部楼层
SixPy 发表于 2016-7-22 08:55
你看一下 cdn_logs 里有没有 之前插入的数据~

有插入数据,,,,脚本从原数据库表中提取数据到9W左右,判断处理过插入汇cdn_logs的有6W左右,就挂掉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 09:08:34 | 显示全部楼层
liangmanxing 发表于 2016-7-22 09:03
有插入数据,,,,脚本从原数据库表中提取数据到9W左右,判断处理过插入汇cdn_logs的有6W左右,就挂掉了

你再去复习一下 MySql 的事务处理~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 09:09:19 | 显示全部楼层
SixPy 发表于 2016-7-22 09:08
你再去复习一下 MySql 的事务处理~

嗯嗯,这是因为mysql的问题????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 09:12:50 | 显示全部楼层
liangmanxing 发表于 2016-7-22 09:09
嗯嗯,这是因为mysql的问题????

还要我说出来啊~
你写的代码太挫~
9万漏了3万,没及时提交事务
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 09:22:58 | 显示全部楼层
SixPy 发表于 2016-7-22 09:12
还要我说出来啊~
你写的代码太挫~
9万漏了3万,没及时提交事务

9W条日志信息,提取了6W度是因为做了判断,因为9W里面包含了好多的内核日志和错误的网页访问日志,这些都是不要的,所以过滤了一些日志,把符合条件的留了下来,,,,,,代码确实很菜,,,,,但还是不明白为什么去到9W多就会报错,,,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 09:24:39 | 显示全部楼层
liangmanxing 发表于 2016-7-22 09:22
9W条日志信息,提取了6W度是因为做了判断,因为9W里面包含了好多的内核日志和错误的网页访问日志,这些都 ...

看8楼~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 09:37:04 | 显示全部楼层

好,,我脑补一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 11:18:01 | 显示全部楼层

我发现了个问题,我把数据库表清空,从它停止索引查询报错的地方作为索引的开始,也是只有65536条数据被插入到表中,就是cdn_logs这张表每次插入都是只有65536条数据,然后我再手动insert一条数据进去是成功的,这样有可能是什么问题???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 11:22:31 | 显示全部楼层
本帖最后由 SixPy 于 2016-7-22 11:23 编辑
liangmanxing 发表于 2016-7-22 11:18
我发现了个问题,我把数据库表清空,从它停止索引查询报错的地方作为索引的开始,也是只有65536条数据被 ...


65536 刚好是 16位无符号整型的最大值

所以,要看 cdn_logs这张表 的字段设定是怎么样的
是不是某个值超过了 uint 的范围
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 11:25:37 | 显示全部楼层
SixPy 发表于 2016-7-22 11:22
65536 刚好是 16位无符号整型的最大值

所以,要看 cdn_logs这张表 的字段设定是怎么样的

C:\Users\vc\Desktop\333333.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 11:26:44 | 显示全部楼层
SixPy 发表于 2016-7-22 11:22
65536 刚好是 16位无符号整型的最大值

所以,要看 cdn_logs这张表 的字段设定是怎么样的

CREATE TABLE `cdn_logs` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) NOT NULL,
  `time_while` varchar(100) NOT NULL,
  `time_stamp` varchar(100) NOT NULL,
  `ip` varchar(20) NOT NULL,
  `domain` varchar(255) NOT NULL,
  `OS` varchar(255) NOT NULL,
  `pv` tinyint(4) NOT NULL,
  `browser` varchar(255) NOT NULL,
  `cdn_andwidth` int(11) NOT NULL,
  `host_andwidth` int(11) NOT NULL,
  `file_type` varchar(50) NOT NULL,
  `url` varchar(255) NOT NULL,
  `operator` varchar(150) NOT NULL,
  `area` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=65537 DEFAULT CHARSET=utf8
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 11:31:31 | 显示全部楼层
liangmanxing 发表于 2016-7-22 11:26
CREATE TABLE `cdn_logs` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) ...

AUTO_INCREMENT=65537

这就是根源
自动增长到 65537

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

id 是自动增长的

所有,你插入记录,就要指定 id ,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-22 11:51:18 | 显示全部楼层
SixPy 发表于 2016-7-22 11:31
AUTO_INCREMENT=65537

这就是根源

这个问题是不是可以将id int(11)的值改大,,,,,,,,还有插入记录,指定id指的是什么???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 11:57:28 | 显示全部楼层
liangmanxing 发表于 2016-7-22 11:51
这个问题是不是可以将id int(11)的值改大,,,,,,,,还有插入记录,指定id指的是什么???

insert 加一个 id 字段
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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