免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 18469 | 回复: 11
打印 上一主题 下一主题

MySQLdb插入数据时占位符问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-29 15:17 |只看该作者 |倒序浏览
环境说明:
      OS:WinXP
      Python3.2
      MySQL 5.2
      MySQLdb
#----------------------------------------------#
示例代码一:
import re
import os,sys,string
import time
import MySQLdb
……………… #省略
Datalist = []
Datalist1 = ['a','b','c']
Datalist2 = ['1','2']
Datalist = Datalist1 + Datalist2
Datalist = tuple(Datalist)
print (Datalist)
……………… #省略try:
    sql ='''insert into queuelog (a,b,c,d,e) values (%s)''' % ','.join(Datalist)
    print(sql)
……………… #省略
运行结果:
('a', 'b', 'c', '1', '2')
insert into queuelog (a,b,c,d,e) values (a,b,c,1,2)
#----------------------------------------------#
示例代码二:
import re
import os,sys,string
import time
import MySQLdb
……………… #省略
Datalist = ("'a'","'b'","'c'","'1'","'2'",)
……………… #省略
try:
    sql ='''insert into queuelog (a,b,c,d,e) values (%s)''' % ','.join(Datalist)
    print(sql)
……………… #省略
运行结果:
insert into queuelog (a,b,c,d,e) values (‘a’,‘b’,‘c’,‘1’,‘2’)

#----------------------------------------------#
以上两段示例代码,第二个能正常插入Mysql数据库中,而第一个会报SQL语法错误。将第一个示例中的sql改为如下格式:
sql = '''insert into queuelog (a,b,c,d,e) values ''',Datalist

运行结果:
('insert into queuelog (a,b,c,d,e) values', ('a',  'b',  'c',  '1',  '2'))
expected string or buffer


将序列数据插入数据库时,加了%s占位符后原字符型数据为何会改变?有没有什么方法能使示例一的sql结果和示例二相
同?另外Datalist是从日志中提取出来的,数据量比较大正式的格式如下所示:
('2012', 'Jun25', '10:04:46', 'qmgr[32541]', '9D00510600F6', 'aaa@163.com', '30859', 'bbb@263.com', 'sent')









论坛徽章:
0
2 [报告]
发表于 2012-06-29 21:37 |只看该作者

各位大中小小小虾米,难道就没有解答的吗?看来问题比较简单啊。
有谁能将一个包含10多万条记录的列表插入Mysql表中,请举个手!

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-06-29 22:15 |只看该作者
这样行不?
  1. Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> x = ('2012', 'Jun25', '10:04:46', 'qmgr[32541]', '9D00510600F6', 'aaa@163.com', '30859', 'bbb@263.com', 'sent')
  4. >>> y = ["'%s'" % i for i in x]
  5. >>> y
  6. ["'2012'", "'Jun25'", "'10:04:46'", "'qmgr[32541]'", "'9D00510600F6'", "'aaa@163.com'", "'30859'", "'bbb@263.com'", "'sent'"]
  7. >>> sql ='insert into queuelog (a,b,c,d,e) values (%s)' % ','.join(y)
  8. >>> print sql
  9. insert into queuelog (a,b,c,d,e) values ('2012','Jun25','10:04:46','qmgr[32541]','9D00510600F6','aaa@163.com','30859','bbb@263.com','sent')
  10. >>>
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-06-29 23:12 |只看该作者
多谢 cdtits 的帮助,我已经解决了,采用的办法稍有点不同,不过有点吐血的感觉。
sql = '''insert into queuelog (a,b,c,d,e) values ('%s','%s','%s','%s','%s')''' % Datalist
print (sql)
infoDB = cursor.executemany(sql,Datalist)
#===========================以下为打印了输出结果
insert into queuelog (a,b,c,d,e) values (‘a’,'b’,'c’,'1’,'2’)

真是没想法了,占位符改成这样才能正常insert。

论坛徽章:
0
5 [报告]
发表于 2012-06-29 23:57 |只看该作者
本帖最后由 106033177 于 2012-06-29 23:58 编辑

回复 1# yufei_sh
不必自己拼接sql语句,dbapi的execute有第二个可选参数
execute('insert into queuelog (a,b,c,d,e) values (?,?,?,?,?)' ,Datalist)


   

论坛徽章:
0
6 [报告]
发表于 2012-06-30 01:14 |只看该作者
回复 5# 106033177


    Mysql中不能用“?”作为占位符,同时execute是单条数据插入。另外这样写在Python3.2 + MySQLdb中会报sql语句错误。

论坛徽章:
0
7 [报告]
发表于 2012-06-30 10:40 |只看该作者
本帖最后由 106033177 于 2012-06-30 10:42 编辑

回复 6# yufei_sh

1、用?还是%s取决于paramstyle参数的配置,dbapi2.0文档  http://www.python.org/dev/peps/pep-0249/    里的解释
                'qmark'         Question mark style,
                                e.g. '...WHERE name=?'
                'numeric'       Numeric, positional style,
                                e.g. '...WHERE name=:1'
                'named'         Named style,
                                e.g. '...WHERE name=:name'
                'format'        ANSI C printf format codes,
                                e.g. '...WHERE name=%s'
                'pyformat'      Python extended format codes,
                                e.g. '...WHERE name=%(name)s'
也就是说如果 mysqldb 默认不是'qmark' 而是'format'风格的话 可以这样写
execute('insert into queuelog (a,b,c,d,e) values (%s,%s,%s,%s,%s)' ,Datalist)
重点是不要自己拼接sql语句。

2、关于execute是单条插入的问题 dbapi2.0定义了 executemany,下面这个例子是mysqldb文档里的
c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
      [
      ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
      ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
      ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
      ] )


   

论坛徽章:
0
8 [报告]
发表于 2012-07-01 14:01 |只看该作者
回复 7# 106033177

非常感谢您的回答,因我刚接触Python很多方面还不是很了解。

   

论坛徽章:
0
9 [报告]
发表于 2012-07-01 14:13 |只看该作者
回复 7# 106033177

还有个问题想请教下:
2、关于execute是单条插入的问题 dbapi2.0定义了 executemany,下面这个例子是mysqldb文档里的
c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
      [
      ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
      ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
      ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
      ] )[/
color]

Values后面列表如果是个变量的话是否会影响SQL语句?我在Python3.2的WinXP环境中运行正常了,同样的语句在Pyton2.7的CentOS5环
境中却一直报:not all arguments converted during string formatting这个错误。您怎么看这问题的?

论坛徽章:
0
10 [报告]
发表于 2012-07-02 20:16 |只看该作者
回复 9# yufei_sh
yufei_sh 发表于 2012-07-01 14:13
回复 7# 106033177
Values后面列表如果是个变量

不是很理解你的意思,给个例子看看?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP