我不明白为什么其中一个有效,另一个没有。请解释我是如何错误地处理这个字符串的

时间:2012-11-22 11:39:21

标签: python sql command db2 ibm-midrange

我是Python的新手,我想我会通过写入DB2数据库来尝试它。 Python是2.7并且在iSeries上运行。我喜欢Python而不是RPG或CL的想法,我在todo列表上有各种各样的东西,所以我从第一原则开始......但是我遇到了一个问题 - 我似乎不明白Python是怎么回事处理字符串。这是一个例子:

请解释原因:

db2cursor.execute('insert into trickledb.trickledb values(?, ?, ?, ?, ?, ?, ?, ?)',
        ('01100158059642','1055','2012-09-12','13:30:05','0700','1','1','28010'))

完全正常,(值插入到我的数据库中)但是:

sql="'insert into trickledb.trickledb values(?, ?, ?, ?, ?, ?, ?, ?)',
    ('01100158059642','1055','2012-09-12','13:30:05','0700','1','1','28010')"
db2cursor.execute(sql)

给出错误:

db2cursor.execute(sql)
db2.Error: SQLState: 42601, Error code: -104
Token 'insert into trickledb.trickle was not valid.
Valid tokens: ( END GET SET CALL DROP FREE HOLD.

我的大脑受伤了!

这是我的完整脚本 - 我从XML文件中提取数据:

#!/usr/bin/env python
# (Be in -*- python -*- mode.)
import db2
from xml.dom import minidom
db2connection = db2.connect()
db2cursor = db2connection.cursor()
xmldoc = minidom.parse('test.XML')
itemlist = xmldoc.getElementsByTagName('PluSale') 
for s in itemlist :
    print s.attributes['PluCode'].value, s.attributes['TicketNumber'].value, s.attributes['Time'].value, s.attributes['Date'].value, s.attributes['StoreNumber'].value, s.attributes['PosNo'].value, s.attributes['Qty'].value, s.attributes['SequenceNbr'].value
    PluCode = s.attributes['PluCode'].value
    TicketNumber = s.attributes['TicketNumber'].value
    Time = s.attributes['Time'].value
    Date = s.attributes['Date'].value
    StoreNumber = s.attributes['StoreNumber'].value
    PosNo = s.attributes['PosNo'].value
    Qty = s.attributes['Qty'].value
    SequenceNbr = s.attributes['SequenceNbr'].value
    string = "%s,%s,%s,%s,%s,%s,%s,%s" %(PluCode,TicketNumber,Date,Time,StoreNumber,PosNo,Qty,SequenceNbr)
    list = [PluCode,TicketNumber,Date,Time,StoreNumber,PosNo,Qty,SequenceNbr]
    tuple = (PluCode,TicketNumber,Date,Time,StoreNumber,PosNo,Qty,SequenceNbr)
    print string
    print list
    print tuple
    db2cursor.execute ('insert into trickledb.trickledb values(?, ?, ?, ?, ?, ?, ?, ?)', tuple)
db2connection.commit()
db2cursor.close()
db2connection.close()

我一直在用.execute语句参数位中的list替换带有字符串的元组,没有任何乐趣。我确定这很简单,我完全不懂。这是我真正想要克服的绊脚石,因为我喜欢在我的iSeries上使用Python的想法......与RPG或CL相比,它的功能非常强大......

3 个答案:

答案 0 :(得分:1)

你正在尝试的是这样的:

def foo(x, y=None): print x, y

foo(1, 2)

args = '1, 2'
foo(args)

在第二个实例中,您最终会使用单个字符串参数(foo)调用args,该参数将绑定到xy将结束使用其默认值。 args的内容看起来像您在第一个实例中传递的参数这一事实并不重要。 Python(以及大多数编程语言,就此而言)只是不起作用。

答案 1 :(得分:1)

在你的第一个例子中,你传递了查询字符串和参数,在你的第二个例子中,两者都作为一个大字符串传递(这没有意义)..

比较这两个:

>>> a = '("1", "2", "3")'
>>> print len(a)
15
>>> b = ('1', '2', '3')
>>> print len(b)
3

a只是一串字符,b是3个元素的tuple ...

答案 2 :(得分:0)

感谢上面的Jon和Marcelo,我意识到我正在将一种使用SQL的方式从一个环境转移到另一个不适合的环境。

在此资源的帮助下: http://www.ibm.com/developerworks/data/tutorials/db2pylnx/db2pylnx-pdf.pdf 在Jon的上述评论中,我了解到SQL语句中的问号是语句后元组中值的“placemarkkers”。 一个非常简单的例子是

tuple = ('SOMEVALUE', 'SOME OTHER VALUE')
'SELECT * FROM WHEREEVER WHERE COLUMN1 = '?' AND COLUMN2 = '?', (TUPLE)'

我的其余问题是我自己制作的。我从minidom创建的列表中提取值。该列表包含UNICODE,因为它是原始XML文件的组成部分。

错误是“_db2.Error:Param 0:String expected”。我误解了,假设db2参数应该是一个字符串。它应该是一个元组(当我将其更改为我得到的字符串时:“_ db2.Error:参数必须是元组或列表。”

元组db2期望应该包含ASCII字符串。不是unicode 所以我修改了代码,用ascii而不是unicode加载我的字符串:

PluCode = str(s.attributes['PluCode'].value)
TicketNumber = str(s.attributes['TicketNumber'].value)
Time = str(s.attributes['Time'].value)
Date = str(s.attributes['Date'].value)
StoreNumber = str(s.attributes['StoreNumber'].value)
PosNo = str(s.attributes['PosNo'].value)
Qty = str(s.attributes['Qty'].value)
SequenceNbr = str(s.attributes['SequenceNbr'].value)

这使得“打印元组”改变为:

(u'01100158059642', u'1055', u'2012-09-12', u'13:30:05', u'0700', u'1', u'1', u'28010')

为:

('01100158059642', '1055', '2012-09-12', '13:30:05', '0700', '1', '1', '28010') 

我的数据库已更新!

db2 "select * from trickledb.trickledb" 
PLUCOD         TICKETNO  DATE       TIME     STORENO  POSNO  QTY  SEQNO
-------------- --------- ---------- -------- -------- ------ ---- -----
01100158059642 1055      2012-09-12 13:30:05 0700     1      1    28010

非常感谢 - 我觉得我的Python学习曲线现在不是垂直的!

相关问题