3

私はPythonを初めて使用し、DB2データベースに書き込んで試してみようと思いました。Pythonは2.7で、iSeriesで実行されています。やることリストにあるさまざまなことについて、RPGやCLの代わりにPythonのアイデアが好きなので、最初の原則から始めています...しかし、問題が発生しました-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)

foo2番目の例では、単一の文字列パラメーター()を使用して呼び出すことになりargsます。これは、にバインドされxyデフォルト値で終了します。の内容がargs最初に渡したパラメーターのように見えるという事実は重要ではありません。Python(およびほとんどのプログラミング言語)は、そのようには機能しません。

于 2012-11-22T11:44:09.453 に答える
1

最初の例では、クエリ文字列とパラメータを渡します。2番目の例では、両方を1つの大きな文字列として渡します(これは意味がありません)。

これら2つを比較してください。

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

私の問題の残りは私自身の作成の1つでした。minidomによって作成されたリストから値を引き出していました。リストには、元のXMLファイルの構成要素であるUNICODEが含まれていました。

エラーは「_db2.Error:Param 0:Stringexpected」でした。そして、db2パラメーターが文字列であると想定することを誤解しました。タプルである必要があります(文字列に変更すると、「_ db2.Error:パラメーターはタプルまたはリストである必要があります。」

db2が期待していたタプルには、ASCII文字列が含まれている必要があります。Unicodeではないので、UnicodeではなくASCIIで文字列をロードするようにコードを変更しました。

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 に答える