最近在爬虫有些进展,决定用mysql储存数据。今天遇到了很多问题,一一记下来作为备忘。
虽然说root用户最好不用,但是,新增加一个数据库之后,权限的设置着实让人头疼,有时候把所有的权限都给了,依然说没有权限。最好是用root测试完成之后,再替换上已经授权的用户。如果出现问题,可以定位在权限上。
打开数据库:
self.db = MySQLdb.connect(host="localhost", port=3307, user='root', passwd='passwd', db='database')
如果数据库不在本地,把localhost修改成相应的ip。database最好在这一步决定。
新建光标:
self.cursor = self.db.cursor()
光标相当于一个指针,这样我们就可以利用它的execute属性执行sql语句了。比如我要写入内容:
insert into login_time (name,login_time) values ('name','time')
我的程序里要多次插入,因此要动态的生成这个语句:
sql = "insert into login_time (name,login_time) values (%s,%s)"\
%(self.names[item], self.times[item])
但是程序一直报错:
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\\u4f55\\u5319','1411286990000')' at line 1")
把那条语句单独拿出来去mysql终端去运行,又什么问题都没有。把那条语句反复print之后,发现问题在于%s,self.names[item]是字符串,去替换%s之后,就去掉了'',而执行SQL语句的时候,''表示字符串,又是必要的。修改成%r:
sql = "insert into login_time (name,login_time) values (%r,%r)"\
%(self.names[item].encode, self.times[item])
发现依然报错。问题还是一样,不过根据我的经验,我的做法是对的,只是问题又出在了哪里呢?试验了各种输出之后,发现name是unicode编码,字符串前有u。讨人厌的编码啊。以前遇到过,轻松解决:
sql = "insert into login_time (name,login_time) values (%r,%r)"\
%(self.names[item].encode('raw_unicode_escape'), self.times[item])
送了一口气,把程序执行一遍,没有错误,神清气爽,但是尼,数据库是空的。
我反反复复在每个地方检查,发现程序确实执行了SQL语句,而且我把SQL语句放到mysql的终端上运行,并没有问题。查了一下,发现mysql执行完之后还要提交,关闭光标,关闭数据库!!!!
self.db.commit()
self.cursor.close()
self.db.close()
就是这三剑客了。明天上我的爬虫的成果。
————————————————
github主页:https://github.com/gt11799
E-mail:gting405@163.com