2011-12-16 5 views
4

私のpostgresqlデータベースにxmlを使用しています。カスタムタイプでSQLAlchemyのxmlデータを処理する必要があります。SQLAlchemy TypeDecoratorが機能しません

xml.etreeと通信するためにXMLTypeクラスを作成しましたが、希望通りに動作しません。

import xml.etree.ElementTree as etree 

class XMLType(sqlalchemy.types.TypeDecorator): 

    impl = sqlalchemy.types.UnicodeText 
    type = etree.Element 

    def get_col_spec(self): 
     return 'xml' 

    def bind_processor(self, dialect): 
     def process(value): 
      if value is not None: 
       return etree.dump(value) 
      else: 
       return None 
     return process 

    def process_result_value(self, value, dialect): 
     if value is not None: 
      value = etree.fromstring(value) 
     return value 

これは、検索した値と結果の処理に適しています:

は、私が書いたコードをhere`s。しかし、私は行を挿入しようとしたとき、私は(もちろん、私は body xml.etree.ElementTree.Elementとしてオブジェクトを置く)のエラーが表示されます。

IntegrityError: (IntegrityError) null value in column "body" violates not-null 
constraint "INSERT INTO comments (id, author_id, look_id, body, created_at) 
VALUES (nextval('object_seq'), %(author_id)s, %(look_id)s, %(body)s, now()) 
RETURNING comments.id" {'body': None, 'author_id': 1550L, 'look_id': 83293L} 

body値がNoneであることを見て、それが結合プロセッサが動作しないことは明らかですしかし、私はそれを正しく実装したと思うので、状況を変えるために何をすべきか分かりません。

process_bind_param私には同じエラーが表示されます。

私のコードでどこが間違っていましたか?

答えて

4

​​関数は、XMLをストリーム(デフォルトでstdout)にダンプし、Noneを返します。 ElementTree.tostring()を使用するか、StringIOオブジェクトにダンプしてください。

+0

ありがとうございます。 SQLAlchemyの問題ではなく、私の無知だった。 :-) – yoloseem

+0

@HyunjunKim [faq#howtoask]を読むことをお勧めします。 –

+0

ああ、私は「受け入れられた答え」機能があるのか​​分からなかった。やった。ご検討いただきありがとうございます。 – yoloseem

関連する問題