如何使用python翻译PostgreSQL OID

时间:2013-07-12 22:46:36

标签: python postgresql types database-schema psycopg2

我对psycopg2 Python模块有点麻烦。我写了一个小代码,使用psycopg2模块从PostgreSQL表中提取一些信息。我想知道表中每列的数据类型:

import os, psycopg2, getpass, sys, string

userpass = getpass.getpass()

# Connect to the database
conn = psycopg2.connect("host=hostname dbname=db user=username password=%s" %  (userpass))
cur = conn.cursor()
cur.execute("SELECT * FROM database.table;")

fieldTypes = [desc[1] for desc in cur.description]

print fieldTypes

当我执行此代码时,我得到一个整数列表(即OID)。有没有办法将其转换为更容易理解的东西(例如'str','int','bool'等等。)

1 个答案:

答案 0 :(得分:1)

您可以转换" OID"通过简单转换来text - 只要OID (Object Identifier)实际上是regtype(已注册类型的OID子类型),就像从函数pg_typeof()获得的那样。

Postgres通常会将数据类型regtype的值显示为text给用户。例如:

SELECT pg_typeof('2013-1-1'::date);
 pg_typeof
-----------
 date

虽然在内部它是OID:

SELECT pg_typeof('2013-1-1'::date)::oid;
 pg_typeof
-----------
      1082

如果您的客户不这样做,您可以使用明确的演员强制它:

SELECT pg_typeof('2013-1-1'::date)::text;
SELECT 1082::regtype::text;

获取系统目录

中所有列的类型

目前还不清楚 你实际上是如何检索这些类型的。请考虑此查询以获取完整信息:

SELECT attname
     , atttypid::regtype AS base_type
     , format_type(atttypid, atttypmod) AS full_type
FROM   pg_catalog.pg_attribute
WHERE  attrelid = 'public.tbl'::regclass  -- your table name here
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

  attname   |          base_type          |         full_type
------------+-----------------------------+-----------------------------
 age_id     | integer                     | integer
 age        | text                        | text
 ageabk     | character                   | character(2)
 foo        | boolean                     | boolean
 log_up     | timestamp without time zone | timestamp without time zone

请注意,format_type(..)会显示包含修饰符的类型。