- 使用sql执行语句的时候,很容易忘了提交,即 db.comment() ,在执行插入语句的时候如果忘记comment,实际上数据是没有插入进去的,需要comment才能成功插入数据。
- 使用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,每天写至少一篇技术文章,每天进步一点点。