2011-12-14 3 views
1

カントのpython informixdbでINSERTクエリの正しい構文を見つけるのpython informixdb経由でInformixのSQLの挿入構文を探して

  • のpython 2.6.6
  • PythonのINFORMIXDBバージョン2.5
  • ドライバ名:IBM Informix- ESQL
  • ドライバのバージョン:Debianのスクイズで3.50.FC8

がここにドキュメントだ - http://informixdb.sourceforge.net/manual.html#binding-parameters

>>> cursor.execute('INSERT INTO names VALUES(:first,:last,:age)', 
...    dict(first='some', last='body', age=56)) 

は、だから私は、たとえば

cursor.execute('INSERT INTO transit_auftrag_i VALUES(:auftragskey,:transitkunde,:status)',dict(auftragskey='erII',transitkunde='DMIeLE',status='OK')) 

を試してみましたこれは私がしてください試みることができるものを任意のヒント私は、この例では何を得る

<class '_informixdb.ProgrammingError'> 
('PREPARE', -236, [{'message': 'Insert value list does not match column list', 'sqlstate': '21S01'}]) 
<class '_informixdb.ProgrammingError'> 
('DESCRIBE', -410, [{'message': 'Syntax error or access violation in PREPARE or EXECUTE IMMEDIATE', 'sqlstate': '37000'}]) 
Segmentation fault 

のですか?

UPDATE:Informixの11.50.xC8

UPDATE

おかげで今のところ。私はエラーなしで実行される以下のクエリを実行しますが、カーソルからのメッセージもなく、何も挿入しません。もしあなたが示唆を持っていれば、それは素晴らしいでしょう。

cursor.execute("INSERT INTO transit_auftrag_i (auftragskey,transitkunde,status) VALUES (:a,:b,:c)", dict(a='A',b='B',c='C')) 
+0

と思われます。私はconn.autocommit = Trueを設定する必要がありました – groovehunter

答えて

2

あなたが移入することを明示的に列をリストする必要があります

INSERT INTO names (firstname, lastname, age) VALUES (:first,:last,:age)

Apperentlyあなたのテーブルがあなたの供給よりも多くの列を持っている、またはそれらが異なる順序です。 INSERT文の列を述べない

は、データベースのテーブルに列をたくさん持っている場合は、また、列挙型を含むクラスを作成することを検討

+0

私は '(:auftragskey、:transitkunde、:status)'の部分を想定していました。私は試してみる – groovehunter

+0

いいえ、それらは列の値です(そのため、それは 'VALUES'部分にあります)。dict()部分は、*列*の名前ではなく*パラメータ*の名前を参照します –

0

できるだけ迅速にオフに取り除く必要があること、悪いプログラミング習慣です、名前で列を参照してください。 1 1/2年前の私たちのAMRプロジェクトの冒頭で、私は、20以上の列テーブル(ベンダーからのデータ入力)上のインデックス番号だけを使って列を参照しようとしました。私が授業を作るまでは災害だった。

次はPython 2.6.5です。

premid = mapErtToPremId(ins_row[d.DeviceID], ins_row[d.DeviceType], ins_row[d.ChannelNumber], db) 


class drIdx(): 
    def __init__(self): 
     self.MeterID = 0 
     self.Reading = 1 
     self.ReadingDateTime = 2 
     self.Account = 3 
     self.CustomerLN = 4 
     self.CustomerFN = 5 
     self.DeviceID = 6 
     self.DeviceType = 7 
     self.ChannelNumber = 8 
     self.DecodeType = 9 
     self.LoadDateLocal = 10 
     self.PremiseID = 11 
関連する問題