mysql - 数据库插入频繁导致数据丢失
问题描述
插入语句有两条,循环插入这两条只是简单写了下插入语句,没有捕捉到异常
def process_item(self, item, spider):#print(item)try: with self.connection.cursor() as cursor:#Create a new recordsql1 = 'INSERT INTO staff (XNXQ, department, teacher, gender, title, note1, note2) VALUES (%s, %s, %s, %s, %s, %s, %s)'cursor.execute(sql1, (item[’first’][’XNXQ’], item[’first’][’department’], item[’first’][’teacher’], item[’first’][’gender’], item[’first’][’title’], item[’first’][’note1’], item[’first’][’note2’]))self.connection.commit()#Create a new recordcursor.execute('select max(id) from staff')teacherId = cursor.fetchone()[’max(id)’]print(’teacherId:’ + str(teacherId))print(item[’second’]) sql2 = 'INSERT INTO staffCourse (teacherId, snum, course, credit, teachWay, courseType, classNum, className, stuNum, week, section, location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'cursor.execute(sql2, (teacherId, item[’second’][’snum’], item[’second’][’course’], item[’second’][’credit’], item[’second’][’teachWay’], item[’second’][’courseType’], item[’second’][’classNum’], item[’second’][’className’], item[’second’][’stuNum’], item[’second’][’week’], item[’second’][’section’], item[’second’][’location’]))self.connection.commit()except Exception as e: print(’------------------------------------------’) print(e)
查看数据库时,发现少了很多,我猜应该是频繁插入导致数据丢失的,因为我在插入数据库之前把数据print了一下,没少。怎么解决这个问题?
问题解答
回答1:你是不是一次性循环了很多次啊如果我没记错的话。数据库有个队列缓存的,如果一下子塞入太多数据占满了缓存,就会产生丢失的现象如果有大量数据要插入的话,就要自己实现队列,然后定时插入
或者试试事务
回答2:由于看不懂python语法,仅从sql的角度来提供2种解决方法:1、用事务的方式去进行写入数据,每1000条数据提交一次,例如:
fake code
for data.size BEGINfor 1000 INSERT INTO ...end COMMITend
2、将sql改成批量写入,性能有不少提高
INSERT INTO (...)VALUES (...),(...),(...),(...);回答3:
可以看下数据库日志,看下执行记录。
回答4:你虽然代码里面写了insert之后,commit。但是在什么时候提交,是在你的项目中的事务中控制的,而不是你在这里控制的,项目中可能从切面做了事务的控制。解决方案:1.分页插,配置事务,不要一次性插入,分批插入,分批commit数据。
相关文章:
1. docker - 如何修改运行中容器的配置2. dockerfile - [docker build image失败- npm install]3. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!4. 为什么我ping不通我的docker容器呢???5. nignx - docker内nginx 80端口被占用6. angular.js - angular内容过长展开收起效果7. docker不显示端口映射呢?8. docker绑定了nginx端口 外部访问不到9. docker - 各位电脑上有多少个容器啊?容器一多,自己都搞混了,咋办呢?10. docker网络端口映射,没有方便点的操作方法么?
