0

私はpsycopg2でpostgres 9.1とpython 2.7を使用しています。私はユーザー定義型を持っています。

CREATE TYPE RegCompT AS (short_name VARCHAR, description VARCHAR, currency CHAR(3), NumId INTEGER);
CREATE OR REPLACE FUNCTION cw.create_tree( IN treespec RegCompT[] )...

Python でこのタイプのオブジェクトの配列を作成し、このストアド関数を呼び出そうとしています。ここに私のpythonコードがあります:

import os, sys, csv, psycopg2
import psycopg2.extensions as ps2e
# -- see http://initd.org/psycopg/docs/advanced.html#adapting-new-python-types-to-sql-syntax
class RegDefT(object):
    def __init__(self, row): 
        self.short_name, self.desc, self.currency, self.N = row[0:4]

def adapt_RegDefT(x):
    return ps2e.AsIs("'(%s, %s, %s, %s)'" % (ps2e.adapt(x.short_name), ps2e.adapt(x.desc), ps2e.adapt(x.currency), ps2e.adapt(x.N)))  
ps2e.register_adapter( RegDefT, adapt_RegDefT )

# -- some regions
region_defs = []
region_defs.append( RegDefT( ["NA", "North America", "USD", 10] ) )
region_defs.append( RegDefT( ["EMEA", "Europe Middle-east Africa", "EUR", 11] ) )
region_defs.append( RegDefT( ["APAC", "Asia Pacific", "USD", 20] ) )

# using it
try:
    dbcon = psycopg2.connect( "dbname=lab" )
    curs = dbcon.cursor()
    qs = "select * from cw.create_tree(%s)"
    print "SQL GENERATED:", curs.mogrify( qs, [region_defs] )
    curs.execute( qs, [region_defs] )
except Exception, e:
    print "failed to execute:", qs, e

しかし、それが生成するものは、python でも psql でも機能しません。

SQL GENERATED: select * from cw.create_tree(ARRAY['('NA', 'North America', 'USD', 10)', '('EMEA', 'Europe Middle-east Africa', 'EUR', 11)', '('APAC', 'Asia Pacific', 'USD', 20)'])
failed to execute: select * from cw.create_tree(%s) syntax error at or near "NA"
LINE 1: select * from cw.create_tree(ARRAY['('NA', 'North America', ...

postgresqlが望んでいるのは、配列指定子の異なるフォーマットです-文字列を引用せずに、'(ではなく "(、 "ARRAY ["ではなく' {.

select * from cw.create_tree( '{"(NA, North America, USD, 10)", 
                                "(EMEA, Europe Middle-east Africa, EUR, 11)",
                                "(APAC, Asia Pacific, USD, 20)" }');

Pythonの終わりで何が間違っていますか? それとも、配列の代替仕様を受け入れるためにpostgresqlに設定するオプションですか? psycopg2 のバージョンは zypper で python-psycopg2-2.4.5-3.1.2.x86_64 と表示されます -- これは適切なバージョンですか?

ありがとう

4

0 に答える 0