0

我在使用 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'等等)。

4

1 回答 1

2

您可以text通过简单的转换将“OID”转换为 - 前提是OID(对象标识符)实际上是一个regtype(注册类型的 OID 子类型),就像您从函数中获得的一样pg_typeof()

Postgres 通常会向用户显示数据类型的regtypetext。例子:

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(..)显示类型包括修饰符。

于 2013-07-13T01:33:23.137 回答