Rumah > Soal Jawab > teks badan
插入语句有两条,循环插入这两条
只是简单写了下插入语句,没有捕捉到异常
def process_item(self, item, spider):
#print(item)
try:
with self.connection.cursor() as cursor:
#Create a new record
sql1 = "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 record
cursor.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了一下,没少。
怎么解决这个问题?
天蓬老师2017-04-17 15:16:37
你是不是一次性循环了很多次啊
如果我没记错的话。数据库有个队列缓存的,如果一下子塞入太多数据占满了缓存,就会产生丢失的现象
如果有大量数据要插入的话,就要自己实现队列,然后定时插入
或者试试事务
高洛峰2017-04-17 15:16:37
由于看不懂python语法,仅从sql的角度来提供2种解决方法:
1、用事务的方式去进行写入数据,每1000条数据提交一次,例如:
fake code
for data.size
BEGIN
for 1000
INSERT INTO ...
end
COMMIT
end
2、将sql改成批量写入,性能有不少提高
INSERT INTO
(...)
VALUES
(...),
(...),
(...),
(...);
ringa_lee2017-04-17 15:16:37
你虽然代码里面写了insert之后,commit。但是在什么时候提交,是在你的项目中的事务中控制的,而不是你在这里控制的,项目中可能从切面做了事务的控制。解决方案:
1.分页插,配置事务,不要一次性插入,分批插入,分批commit数据。