我是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相比,它的功能非常强大......
答案 0 :(得分:1)
你正在尝试的是这样的:
def foo(x, y=None): print x, y
foo(1, 2)
args = '1, 2'
foo(args)
在第二个实例中,您最终会使用单个字符串参数(foo
)调用args
,该参数将绑定到x
,y
将结束使用其默认值。 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学习曲线现在不是垂直的!