python2.7操作mysql库MySQLdb中execute 方法的注意要点

  1. 使用sql执行语句的时候,很容易忘了提交,即 db.comment() ,在执行插入语句的时候如果忘记comment,实际上数据是没有插入进去的,需要comment才能成功插入数据。
  2. 使用execute执行插入语句的时候,如果插入的数据写在sql中,即不传插入的参数execute(sql, args=None)如:

    sql = 'insert into hospital(htitle, kind1) values (%s, %s)' % ('xxx医院', '三级甲等'),由于字段htitle和kind1是varchar类型,所以插入的字符串需要用英文双引号和单引号括起来,表示插入的是字符串,即:
    sql = 'insert into hospital(htitle, kind1) values (“%s”, “%s”)' % ('xxx医院', '三级甲等'),%s 改为“%s”,不然执行的时候会报错

sql = 'insert into hospital(htitle, kind1) values ("%s", "%s")' % ('xxx医院', '三级甲等')
result = cur.execute(sql) #返回受影响的行数
connect.commit()
print result

如果插入的数据通过参数传入,就不需要考虑字段的数据类型,因为execute方法内部通过db.literal(args)处理为对应的数据类型了,查看execute的源码:

    def execute(self, query, args=None):

        """Execute a query.
        
        query -- string, query to execute on server
        args -- optional sequence or mapping, parameters to use with query.

        Note: If args is a sequence, then %s must be used as the
        parameter placeholder in the query. If a mapping is used,
        %(key)s must be used as the placeholder.

        Returns long integer rows affected, if any

        """
        del self.messages[:]
        db = self._get_db()
        charset = db.character_set_name()
        if isinstance(query, unicode):
            query = query.encode(charset)
        if args is not None:
            query = query % db.literal(args) #转化为SQL文字值
        try:
            r = self._query(query)
        except TypeError, m:
            if m.args[0] in ("not enough arguments for format string",
                             "not all arguments converted"):
                self.messages.append((ProgrammingError, m.args[0]))
                self.errorhandler(self, ProgrammingError, m.args[0])
            else:
                self.messages.append((TypeError, m))
                self.errorhandler(self, TypeError, m)
        except:
            exc, value, tb = sys.exc_info()
            del tb
            self.messages.append((exc, value))
            self.errorhandler(self, exc, value)
        self._executed = query
        if not self._defer_warnings: self._warning_check()
        return r

如:

sql = 'insert into hospital(htitle, kind1) values (%s, %s)'
args = ('xxx医院', '三级甲等')
result = cur.execute(sql, args=args)
connect.commit()
print result

如果你就是想把插入的数据写在sql中,也可以直接调用 literal 方法将参数转化为对应的数据类型

sql = 'insert into hospital(htitle, kind1) values (%s, %s)' % connect.literal(('xxx医院', '三级甲等'))
result = cur.execute(sql)
connect.commit()
print result

再一个就是 executemany(sql, args)  方法,该方法可以实现数据的批量插入,实际上内部是通过循环execute方法进行插入的,也是一样的原理。

 

欢迎关注公众号:日常bug,每天写至少一篇技术文章,每天进步一点点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值