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