2011-12-20 40 views
1

psycopg2はNoneAdapterを通じてNULLをNoneに変換します すべてのNULLを文字列 'NA'に変換する別のアダプタを作成するにはどうすればよいですか?psycopg2 - NULL型をNoneの代わりに文字列 'NA'に変更する方法

おかげ

* UPDATE: @thatisbrilliantここ
は私が持っているものです。このクエリを実行した後 :

SELECT pg_type.oid 
FROM pg_type JOIN pg_namespace 
    ON typnamespace = pg_namespace.oid 
WHERE typname = 'point' 
    AND nspname = 'pg_catalog'; 

point_oid = 600を取得するので、私はこれを続行:

def NA(value, cur): 
    if value is None: 
     return 'NA' 
    return value 
None2NA = psycopg2.extensions.new_type((600,), 'None2NA', NA) 
psycopg2.extensions.register_type(None2NA) 

まだ動作しません。まだ返されません。

+0

'COALESCE()'が動作しない理由はありますか? –

+0

私はどの列がnullになるのか分からず、多くの列があるだけです。 – BPm

答えて

4

実際には、NoneAdapterは、あなたが望むものとは逆の動作をし、PythonのNone型をSQL NULLに変換します。 SQL型をPythonオブジェクトにキャストする方法については、official psycopg2 documentationを参照してください。その後

def NA(value, cur): 
    if value is None: 
     return 'NA' 
    return value 

psycopg2.extensions.new_typeに登録すると:

ことに基づいて、あなたはそれが仕事をしたいすべてのタイプのためにあなたのアダプタ機能を登録する必要がありますように見えますが、私は関数は単にだろうと仮定psycopg2.extensions.register_type

+0

なので、私はカーソルの結果ごとに新しい型を登録する必要がありますか?例: 'result = curs.fetchone()[0]; psycopg2.extensions.new_type((結果、)、 'NA'、NA); psycopg2.extensions.register_type( 'NA'); '?もし私が 'results = curs.fetchall()'を持っていれば、 'results'をループして、それぞれに新しい型を登録する必要があるのですか? – BPm

+0

@BPmいいえ、あなたはプログラムの最初に一度だけ登録する必要があります。 'new_type'の最初のパラメータは、アダプタを適用するすべての型(char、numericなど)のOIDを含むタプルです。そして、セミコロンを失う。 – thatwasbrilliant

+0

更新された質問をご覧ください。ありがとうございます – BPm

0

は単純に実行します。

row = cux.fetchone() 
field = row[col] if row[col] is not None else 'NA' 

が完了します!

あなたは、行のすべての列に適用したい場合は、使用マップ():

行=マップ(ラムダX:X Xは他Noneでない場合は 'NA'、cux.fetchone() )

+2

これはPythonで0または空文字列のようなFalseに評価される値に対しては機能しません。 row [col]がNoneでない場合は 'field = row [col]を使用します。他の場合はNULLとFalseに評価される値を区別したい場合は 'NA'です。 –

+0

私はループを行い、Noneの値をチェックし、それに「NA」を追加することができます。しかし、それは私が欲しいものではない、それはかなり大きなリストだから。 – BPm

+0

@PauloScardine良いキャッチ。私はあなたの提案で私の答えを更新しました。 –

関連する問題