3

我是 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'))

完全没问题,(这些值被插入到我的数据库中)但是:

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 语句参数位中用带有列表的字符串替换元组,没有任何喜悦。我确定这很简单,我不完全理解。这是我真正想克服的绊脚石,因为我喜欢在 iSeries 上使用 Python 的想法……与 RPG 或 CL 相比,它太强大了……

4

3 回答 3

1

你正在尝试的是这样的:

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

foo(1, 2)

args = '1, 2'
foo(args)

在第二种情况下,您最终将foo使用单个字符串参数 ( args) 进行调用,该参数将绑定到x,并y以默认值结束。的内容args看起来像您在第一个实例中传递的参数这一事实无关紧要。Python(以及大多数编程语言,就此而言)只是不能那样工作。

于 2012-11-22T11:44:09.453 回答
1

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

比较这两个:

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

a只是一个字符串,btuple3 个元素...

于 2012-11-22T11:45:30.360 回答
0

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

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

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 学习曲线现在并不完全垂直!

于 2012-11-22T15:00:43.487 回答