带有UUID数组列类型的psycopy2出错

时间:2015-04-15 08:57:45

标签: postgresql uuid psycopg2

我无法在Postgres的UUID数组列中插入UUID值。

由于psycopg2没有自动将Python UUID值转换为Postgres UUID,我使用str(my_id)

之类的东西

然而,这是我第一次使用任何数组类型的列。我得到的错误是:

psycopg2.ProgrammingError: column "items" is of type uuid[] but expression is of type text[]
LINE 3: ...0', NULL, '01adae1e-e2cf-11e4-b773-ac8112c8e1fb', ARRAY['01a...
                                                             ^
HINT:  You will need to rewrite or cast the expression.

我已经搜索了这个错误,发现了一些(例如bug 2279bug 2277)Postgres错误报告暗示数组功能的不完整/缺失实现,但我不知道这些是否与我的相关问题。然而,这些似乎已得到解决。 FWIW我正在使用Postgres 9.3.6

为了调试这个,我创建了一个小测试表,例如:

testdb=# \d test_table
    Table "public.test_table"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 key       | integer | 
 item_list | uuid[]  |

我的健谈测试的结果:

DEBUGGING:
Statement:  INSERT INTO test_table
    ("item_list", "key")
    VALUES (%s, %s);
Arguments:  [['2f286cea-e34b-11e4-9b5e-2c768ada7efb', '2f28dd7e-e34b-11e4-9b5e-2c768ada7efb'], 1]
Active Role: test1
Mogrified SQL Expression:
INSERT INTO test_table
    ("item_list", "key")
    VALUES (ARRAY['2f286cea-e34b-11e4-9b5e-2c768ada7efb', '2f28dd7e-e34b-11e4-9b5e-2c768ada7efb'], 1);
Exception ProgrammingError occured. Arguments:
    ('column "item_list" is of type uuid[] but expression is of type text[]\nLINE 3:     VALUES (ARRAY[\'2f286cea-e34b-11e4-9b5e-2c768ada7efb\', \'2...\n                    ^\nHINT:  You will need to rewrite or cast the expression.\n',)
   * * * *   WARNING: Command Failure on Running Statement 
 INSERT INTO test_table
    ("item_list", "key")
    VALUES (%s, %s);!

ERROR:  column "item_list" is of type uuid[] but expression is of type text[]
LINE 3:     VALUES (ARRAY['2f286cea-e34b-11e4-9b5e-2c768ada7efb', '2...
                    ^
HINT:  You will need to rewrite or cast the expression.

None
Traceback (most recent call last):
  File "db-test.py", line 214, in <module>
    db_exec(cursor, stmt, args, debug=True, re_raise=True)
  File "db-test.py", line 62, in db_exec
    cur.execute(stmt, args)
psycopg2.ProgrammingError: column "item_list" is of type uuid[] but expression is of type text[]
LINE 3:     VALUES (ARRAY['2f286cea-e34b-11e4-9b5e-2c768ada7efb', '2...
                    ^
HINT:  You will need to rewrite or cast the expression.

我尝试过的唯一另一件事就是使用uuid raw但我得到了预期的“无法适应”错误。

异常会在我的测试程序中提前一行发生,例如

DEBUGGING:
Statement:  INSERT INTO test_table
    ("item_list", "key")
    VALUES (%s, %s);
Arguments:  [[UUID('2bfaf276-e34c-11e4-8af5-2c768ada7efb'), UUID('2bfb6d82-e34c-11e4-8af5-2c768ada7efb')], 1]
Active Role: test1
Mogrified SQL Expression:
Exception ProgrammingError occured. Arguments:
    ("can't adapt type 'UUID'",)
   * * * *   WARNING: Command Failure on Running Statement 
 INSERT INTO test_table
    ("item_list", "key")
    VALUES (%s, %s);!

None
None
Traceback (most recent call last):
  File "db-test.py", line 214, in <module>
    db_exec(cursor, stmt, args, debug=True, re_raise=True)
  File "db-test.py", line 61, in db_exec
    print cur.mogrify(stmt, args)
psycopg2.ProgrammingError: can't adapt type 'UUID'

测试程序的相关部分如下所示:

46  def db_exec(cur, stmt, args=None, re_raise=True, debug=False, assume_role=None):
47      if (cur is None) or (cur is False):
48          print "ERROR : DB Connection/Cursor is not open for commands"
49          return cur
50      if (debug is True):
51          print "DEBUGGING:"
52          print "Statement: ", stmt
53          if args is not None:
54              print "Arguments: ", args
55      try:
56          if assume_role is not None:
57              cur.execute('SET ROLE "%s";' % assume_role)
58          if debug is True:
59              print "Active Role:", GetCurrentRole(cur)
60              print "Mogrified SQL Expression:"
61              print cur.mogrify(stmt, args)
62          cur.execute(stmt, args)
[...snip...]

我已经看到有一种方法可以为Python添加自定义“autmatic”类型转换&lt; - &gt; Postgres并想知道解决方案是否存在于那里......但我不知道该怎么做(还)

1 个答案:

答案 0 :(得分:2)

我决定调查psycopg2附加内容并找到一个只涉及一行额外代码的解决方案。

提示来自here,位于标题“UUID数据类型”标题下该页底部附近

该行是:

psycopg2.extras.register_uuid()

尽管我对这两种简单的AND数组UUID类型的工作持悲观态度,但它确实很好。此外,这意味着我不再需要手动将每个UUID转换为str。 (反之在我的应用程序中不是问题,但可能它也适用于检索UUID并让它们在python中注册为UUID类型)