python中使用mysql要注意的问题

最近在爬虫有些进展,决定用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值