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

2024-09-30 20:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我想我可以通过写DB2数据库来尝试一下。Python是2.7版本,运行在iSeries上。我喜欢Python而不是RPG或CL来处理我的待办事项,所以我从基本原则开始。。。不过,我遇到了一个问题——我似乎不明白Python是如何处理字符串的。下面是一个例子:

请解释原因:

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

很好,(这些值被插入到我的数据库中),但是:

^{pr2}$

给出错误:

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语句参数位用string替换元组,没有任何乐趣。我敢肯定这是一件很简单的事,我不能完全理解。这是我非常想克服的一个绊脚石,因为我喜欢在iSeries上使用Python的想法。。。与RPG或CL相比,它太强大了。。。。在


Tags: executedatetimevalueattributesqtyprintstorenumber
3条回答

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

比较这两个:

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

a只是一个字符串,b是由3个元素组成的tuple。。。在

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

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

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

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

错误是“_db2.error:Param 0:String expected.”我误解了这一点,以为db2参数应该是字符串。它应该是一个元组(当我把它改成一个字符串时,我得到了:“\udb2.Error:Parameters must be a tuple or list.”在

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

^{pr2}$

这使得“打印元组”从以下方面发生了变化:

^{3}$

收件人:

('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学习曲线现在不是很垂直了!在

你想要的是这样的:

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

foo(1, 2)

args = '1, 2'
foo(args)

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

相关问题 更多 >