私は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 と表示されます -- これは適切なバージョンですか?
ありがとう