簡體   English   中英

我不明白為什么其中一個有效,另一個沒有。 請解釋我是如何錯誤地處理這個字符串的

[英]I don't understand why one of these works and the other doesn't. Please explain how I'm handling this string incorrectly

我是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相比它太強大了......

你正在嘗試的是這樣的:

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

foo(1, 2)

args = '1, 2'
foo(args)

在第二個實例中,您將最終使用單個字符串參數( args )調用foo ,該參數將綁定到xy將以其默認值結束。 args的內容看起來像你在第一個實例中傳遞的參數這一事實並不重要。 Python(以及大多數編程語言,就此而言)只是不起作用。

在您的第一個示例中,您傳遞的是查詢字符串和參數,在第二個示例中,兩者都作為一個大字符串傳遞(這沒有任何意義)。

比較這兩個:

>>> 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語句中的問號是“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學習曲線現在不是垂直的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM